我一直在使用C ++中的函数指针,我已经将它们声明为void (*function)(void)
。这就是我最初在教程和how tutorials still teach it中看到的内容。
但今天,当我发现一个使用替代语法的示例时,我正在阅读维基百科关于高阶函数的文章,其中*
和括号围绕函数指针的变量/类型名字不存在,如here所示。
我测试了void function(void)
形式是否适用于变量,参数和typedef。它不适用于变量,但它适用于参数和typedef,没有明显的变化,实际上可以与标准函数指针语法互换。
我进一步挖了一下,发现an SO question似乎意味着它是一个'函数原型的语法'而不是函数指针。然而,wikipedia's explanation of function prototypes听起来很像预定义函数。
我为我的问题的广泛范围道歉,但这个语法究竟是什么?
答案 0 :(得分:1)
int A[]
作为参数编写,因此除了数组和指针之外不一样。具体规则可在标准草案n4567中找到:
§8.3.5/ 5 ...确定每个参数的类型后,任何 “数组
T
”或函数类型T的参数调整为 是“指向T
”的指针。 ...
稍后会更明确:
§13.2/ 3 ......
参数声明不同之处仅在于一个是函数类型而另一个是指向同一函数类型的指针是 当量。也就是说,调整函数类型以成为指针 到功能类型(8.3.5)。 [示例:
void h(int()); void h(int (*)()); // redeclaration of h(int()) void h(int x()) { } // definition of h(int()) void h(int (*x)()) { } // ill-formed: redefinition of h(int())
- 结束示例] ...
该规则也适用于其他地方(不完整列表):