考虑以下具有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())是最干净,最容易阅读的。

09-26 22:09
查看更多