我以两种方式调用以下库函数:
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/