具有不同语义的函数调用

时间:2012-06-24 17:39:34

标签: c function

考虑这个带有3个不同函数调用语义的代码:

void f(void){
   puts("OK");
}

int main(void){
   f();
  (*f)();
  (&f)();

  return 0;
}

第一种是调用f的标准方法,

第二个是解除引用函数指针的语义,

但在第三个我应用&操作符到函数名称,它似乎工作正常。

第二和第三种情况会发生什么?

感谢。

2 个答案:

答案 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;