gpt4 book ai didi

c - 函数指针比较

转载 作者:太空宇宙 更新时间:2023-11-04 02:02:48 26 4
gpt4 key购买 nike

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

//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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com