这是有效的C99代码吗? (我想我在问它是否可携带)
void test(void){
return;
}
void (*fp)(void) = test;
if (fp == test){ <--- This line
printf("Success\n");
}
我只收集可以比较的相同类型的指针,所以也许我的问题是像“ test”这样的函数名称是否只是指针别名?也许有人可以告诉我我的问题比我可以解决的要好:)
答案 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,强调我的):
两个指针在且仅当两个都是空指针时比较相等,两者都是指向同一对象的指针(包括指向对象和位于其开头的子对象的指针) )或功能,