【发布时间】:2015-03-02 06:35:07
【问题描述】:
编写一个处理函数回调的库时,我经常将函数指针类型转换(和调用)指向具有相同调用约定和相同签名的类型,但有一个例外:它们具有指向不同类型的参数(所有数据)或空指针。
最近,我发现它可能不是那么安全,据此:https://stackoverflow.com/a/14044244/3079266
基本上,按照我的理解,如果参数的类型是兼容的,那就意味着函数指针类型也是兼容的,应该没有问题。
现在,我有 3 个问题。
首先:这是否意味着,由于指向不同类型的指针在技术上是不兼容的,所以我正在做的事情会导致未定义的行为?
第二:我可以在哪里(在什么架构上)摆脱它?其中是 Windows x86 还是 x64 版本?
第三:我哪里不能逃脱?
【问题讨论】:
-
@iharob 但是您传递给这些函数的函数指针必须采用
void指针,否则您有未定义的行为。可以在函数内部强制转换指针,但参数应该是指定的。 -
第一个问题:是的。第二个问题:无处不在。第三个问题:无处(除了当你回答 SO 问题时,这里的人喜欢 UB,如果你没有在需要的地方提到它,就会给你投反对票)。
-
@barakmanos:所以,我可能应该警告用户技术上,这会导致 UB,但实际上不会?谢谢! =)
-
好吧,我不太明白你为什么不使用确切的函数原型。
-
@barakmanos:这个故事有点太长了,无法在 SO 评论中解释,而且不是很有趣 =)
标签: c pointers function-pointers undefined-behavior pointer-conversion