c - 函数指针比较

标签 c

我遇到了以下代码片段,我有两个问题想寻求帮助:

//This is the function poiner 
int (*OnDataAvail)( int *, int *, int * )  

//This is the function header
int ReqHandler_pack(int *vc ATTRIBUTE((unused)),
                    int *req, int *complete ATTRIBUTE((unused)), void* stream)

if((*request)->dev.OnDataAvail == ReqHandler_pack) {

首先: 这部分代码有一个编译器警告: 警告:不同指针类型的比较缺少强制转换 [默认启用]

然后我把它改成

if((int *)(*request)->dev.OnDataAvail == (int *)ReqHandler_pack)

通过更改此设置,警告不存在。但是,我不确定它为什么有效。

另一个问题是:函数指针是否需要有相同数量的参数?

最佳答案

是的,两个函数指针需要具有兼容的签名(对于指向的函数)才能进行比较(或分配)。这意味着每个等级和相同结果类型的相同数量(参数数量)和兼容类型的参数。

给定的实现可能有一个 ABI指定不同的 calling conventions (针对不同签名的功能)。

两个函数指针按位相等的事实取决于实现(当然某些例程 foo 的地址等于相同例程的地址foo相同签名的两个不同函数比较不相等。

这是为了允许实现在机器级别具有不同的方式或指令来调用某些 C 函数,具体取决于其签名。例如,通过寄存器或机器堆栈传递参数,使用不同的跳转或调用机器指令或具有不同的代码块或空间等......但是,我不知道任何这样的奇怪的实现...

关于c - 函数指针比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24842032/

相关文章:

c - getchar 不等待用户输入

c - 为什么 fread 总是返回 0?

c - 在 C 中对数组进行排序,首先对数字进行排序

复杂的makefile

python - 我可以使用 doxygen 来记录命令行程序吗?

c - If-else 中 C 中的奇怪语法错误

c - 使用结构化数组处理文件

c - 使用 Oclint 的 Npath 和圈复杂度

c - Fortran 调用 C : How do I get an efficient vectorised function

c - 在我用 C 语言编写的共享库中允许和不允许导出的函数 - 公共(public)和私有(private)库