3
int func ()
{
  printf("foo()\n"); 
  return 0;
}

void foo1 (int (*pf)()) { pf(); }
void foo2 (int (pf)()) { pf(); }
void foo3 (int pf()) { pf(); }

int main ()
{
  foo1(func);
  foo2(func);
  foo3(func);
}

foo1()传递给和foo2()的参数有什么区别foo3()
所有 3 种语法都可以在 g++ 中正常编译,并且行为方式相同。从技术上讲,这三个都称为函数指针吗?
用 C 标记,因为它也适用于此。

4

1 回答 1

7

它们之间没有区别。第一个参数是指向函数类型的指针,而另外两个只是编写相同函数类型的两种方式。但是,与将数组类型参数调整为指针的方式相同,函数类型参数也调整为指向函数的指针。从 C++11 §8.3.5/5 开始:

在确定每个参数的类型后,将任何类型为[...]“函数返回T”的参数调整为[...]“指向函数返回T的指针”,</p>

或来自 C99 §6.7.5.3/8:

将参数声明为“函数返回类型”应调整为“指向函数返回类型的指针”</p>

因此,第二个和第三个函数声明的参数类型调整为与第一个相同。

请注意,您可以在标识符周围放置任意数量的括号,并且它仍然是相同的函数类型:

void foo2 (int (((((pf)))))()) { pf(); }
于 2013-04-07T12:54:38.063 回答