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种语法compiles fine in g++的行为方式相同。技术上都是3个被称为功能指针吗?
标有C,因为它也适用于此。
答案 0 :(得分:7)
它们之间没有区别。第一个参数是指向函数类型的指针,而另外两个只是编写相同函数类型的两种方式。但是,与将数组类型参数调整为指针的方式相同,函数类型参数被调整为指向函数的指针。从C ++11§8.3.5/ 5:
确定每个参数的类型后,任何类型[...]“函数返回
T
”的参数都被调整为“指向返回T
的函数的指针”。
或者来自C99§6.7.5.3/ 8:
参数声明为“函数返回类型”应调整为“指向函数返回类型”
所以第二个和第三个函数声明的参数类型调整为与第一个相同。
请注意,您可以在标识符周围添加任意数量的括号,它仍然是相同的函数类型:
void foo2 (int (((((pf)))))()) { pf(); }