考虑这个代码有3个不同的函数调用语义:
void f(void){
puts("OK");
}
int main(void){
f();
(*f)();
(&f)();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
第一种是调用f的标准方式,
第二个是解除引用函数指针的语义,
但在第三个我将&运算符应用于函数名称,它似乎工作正常.
在第二和第三种情况下会发生什么?
谢谢.
函数调用总是通过函数指针执行.从C99第6.5.2.2节:
表示被调用函数的表达式应具有指向函数的类型指针.
但是,几乎在所有情况下,函数类型都会衰减为函数指针类型.从C99第6.3.2.1节:
除非它是运算
sizeof符或一元运算&符的操作数,否则将具有"函数返回类型 " 类型的函数指示符转换为具有"指向函数返回类型的指针"类型的表达式.
因此,您的三个调用将被评估:
(&f)();
(&(*(&f)))();
(&f)();
Run Code Online (Sandbox Code Playgroud)
一切都有效.但显然,第一个(f())是最干净,最容易阅读的.