是否可以将函数指针与函数进行相等性比较?

时间:2019-08-14 02:32:42

标签: c function-pointers c99

这是有效的C99代码吗? (我想我在问它是否可携带)

void test(void){
return;
}

void (*fp)(void) = test;

if (fp == test){ <--- This line
    printf("Success\n");
}

我只收集可以比较的相同类型的指针,所以也许我的问题是像“ test”这样的函数名称是否只是指针别名?也许有人可以告诉我我的问题比我可以解决的要好:)

2 个答案:

答案 0 :(得分:3)

该代码是有效的ANSI C。

实际上发生的是,代码中的函数名称(例如test)会自动转换为指向函数的指针。

您可以将test更改为&test,结果是相同的。

答案 1 :(得分:1)

是的,很好。在这种情况下,C标准很容易解释(C11 6.3.2.1/4):

  

函数指示符是具有函数类型的表达式。除非是   sizeof运算符或一元&运算符(带有   类型“函数返回类型”转换为具有类型“函数返回类型的指针”的表达式。

在您的情况下,test是具有函数类型的表达式。它被转换为void(*)(void)类型的函数指针。这是与fp兼容的指针类型,因此==运算符允许它。

关于相等运算符==,该标准说(C11 6.5.9,强调我的):

  

两个指针在且仅当两个都是空指针时比较相等,两者都是指向同一对象的指针(包括指向对象和位于其开头的子对象的指针) )或功能