我遇到了以下代码片段,我有两个问题想寻求帮助:
//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/