考虑以下具有3种差异函数调用语义的代码:
void f(void){
puts("OK");
}
int main(void){
f();
(*f)();
(&f)();
return 0;
}
第一种是调用f的标准方法,
第二个是解引用函数指针的语义,
但是在第三个示例中,我将&运算符应用于函数名称,它似乎可以正常工作。
在第二种和第三种情况下会发生什么?
谢谢。
最佳答案
函数调用始终是,通过函数指针执行。从C99第6.5.2.2节开始:
但是,在几乎所有情况下,函数类型都会退化为函数指针类型。根据C99第6.3.2.1节:
因此,将评估您的三个调用:
(&f)();
(&(*(&f)))();
(&f)();
全部有效。但是显然,第一个(
f()
)是最干净,最容易阅读的。