c - 这两个 C 函数调用有什么区别?

标签 c linux

我以两种方式调用以下库函数:

unsigned int
LsSendToQ(unsigned int p4Node, const char queueName[4], lsMsg *pMsg,
          unsigned int prio) {

}

第一种方式:

LsSendToQ((unsigned int)0, (const char *)Q_NAME, (lsMsg *)(void *)pMsg, 0) 

第二种方式:

LsSendToQ((unsigned int)0, (const char *)Q_NAME, (lsMsg *)pMsg, 0) 

两个调用都可以编译,但哪个是正确的方法?为什么在第一次调用中使用了 (void *),它看起来像我的函数指针?

最佳答案

指向void 的指针是一种“通用”指针类型。 void * 无需显式转换即可转换为任何其他指针类型。您不能取消引用 void * 或用它做指针运算;您必须先将其转换为指向完整数据类型的指针。看这个answer .

所以参数 pMsg 不能直接兼容 lsMsg * 然后第二次调用是在函数调用中使用它的一种可能方式[我没有测试过]。

对了,只要pMsg的类型是lsMsg *第一个就够了。

编辑:

第二个就够了,因为它覆盖了第一个。

关于c - 这两个 C 函数调用有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34868803/

相关文章:

c - C 中排序代码错误

c - 使用 DOSBox 版本 0.74 在 C 中出现多重声明错误

linux - 编写shell脚本时如何使命令并发运行?

linux - 为什么添加新用户后,无密码 ssh 不起作用

node.js - 在 Linux 中安装 Node 和 NPM

linux - 如何在 montavista Linux 上启用守护进程的核心转储?

c - Kill 对信号来说是不安全的尊重 - 还有其他选择吗?

c - 如何在没有引用的情况下更改局部变量

c - 使用 objdump 或类似工具显示每个函数的调用约定

linux - CVS linux 服务器项目太多,服务器命令结果为 "argument list too long"