考虑这个带有3个不同函数调用语义的代码:
void f(void){
puts("OK");
}
int main(void){
f();
(*f)();
(&f)();
return 0;
}
第一种是调用f的标准方法,
第二个是解除引用函数指针的语义,
但在第三个我应用&操作符到函数名称,它似乎工作正常。
第二和第三种情况会发生什么?
感谢。
答案 0 :(得分:8)
通过函数指针执行函数调用始终。从C99第6.5.2.2节:
表示被调用函数的表达式应具有指向函数的类型指针。
但是,几乎在所有情况下,函数类型都会衰减为函数指针类型。从C99第6.3.2.1节:
除非是
sizeof
运算符或一元&
运算符的操作数,一个函数指示符 类型“函数返回类型”将转换为类型为“指向的指针”的表达式 函数返回类型“。
因此,您的三个电话会被评估:
(&f)();
(&(*(&f)))();
(&f)();
一切都有效。但显然,第一个(f()
)是最干净,最容易阅读的。
答案 1 :(得分:1)
在第二种情况下,您使用的是函数指针。函数指针用于记忆对函数的引用,并且能够在调用的其他地方调用它。它们通常用于实现回调。 因此,如果您存储了指向函数的指针,则应使用第一种表示法。
我认为第一个和第三个是等价的。 实际上,如果声明一个函数指针,则可以通过以下方式对其进行初始化:
void AFunction();
void (*funcPtr)() = NULL;
funcPtr = AFunction;
funcPtr = &AFunction;