【问题标题】:Can I compare a function pointer to a function for equality?我可以比较函数指针和函数的相等性吗?
【发布时间】:2019-08-14 02:32:42
【问题描述】:
这是有效的 C99 代码吗? (我想我在问它是否便携)
void test(void){
return;
}
void (*fp)(void) = test;
if (fp == test){ <--- This line
printf("Success\n");
}
我只收集了相同类型的指针可以相互比较,所以也许我的问题是像'test'这样的函数名是否只是指针别名?或者也许有人可以告诉我我的问题比我更好:)
【问题讨论】:
标签:
c
function-pointers
c99
【解决方案1】:
代码是有效的 ANSI C。
实际上发生的情况是,代码中的函数名称(例如 test)会自动转换为指向函数的指针。
你可以把test改成&test,结果是一样的。
【解决方案2】:
是的,没关系。在这种情况下,C 标准是不言自明的(C11 6.3.2.1/4):
函数指示符是具有函数类型的表达式。除了当它是
sizeof 运算符的操作数,或一元 & 运算符,一个函数指示符
类型“函数返回类型”被转换为具有“指向函数返回类型的指针”类型的表达式。
在您的情况下,test 是具有函数类型的表达式。它被转换为void(*)(void) 类型的函数指针。这是与fp 兼容的指针类型,因此== 运算符允许它。
关于相等运算符==,标准说(C11 6.5.9,强调我的):
两个指针比较相等,如果且仅当两者都是空指针时,都是指向同一个对象的指针(包括指向对象的指针和开头的子对象) 或 函数,