具有不同语义的函数调用

考虑这个代码有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节:

除非它是sizeof运算符或一元&运算符的操作数,否则将具有“函数返回类型 ”类型的函数指示符转换为具有“指向函数返回类型的指针”类型的表达式。

因此,您的三个调用将被评估:

 (&f)(); (&(*(&f)))(); (&f)(); 

一切都有效。 但显然,第一个( f() )是最干净,最容易阅读的。

在第二种情况下,您正在使用函数指针。 函数指针用于记忆对函数的引用,并且能够在调用的其他位置调用它。 它们通常用于实现回调。 因此,如果您存储了指向函数的指针,则应使用第一种表示法。

我认为第一个和第三个是等价的。 实际上,如果声明一个函数指针,您可以通过以下方式初始化它:

 void AFunction(); void (*funcPtr)() = NULL; funcPtr = AFunction; funcPtr = &AFunction;