备用函数语法/函数原型
Alternate function syntax/function prototypes?
我一直
在使用函数指针,C++我一直将它们声明为void (*function)(void)
。这就是我最初在教程中看到它的方式,也是教程仍然如何教授它的方式。
但是今天,当我阅读维基百科关于高阶函数的文章时,我发现了一个使用替代语法的示例,其中函数指针的变量/类型名称周围的*
和括号不存在,如下所示。
我测试了表单是否void function(void)
适用于变量、参数和 typedef。它不适用于变量,但它适用于参数和 typedef,没有明显的变化,实际上可以与标准函数指针语法互换。
我进一步挖掘,发现了一个SO问题,似乎暗示它是"函数原型"的语法,而不是函数指针。然而,维基百科对函数原型的解释听起来很像只是预先声明函数。
对于我的问题范围很广,我深表歉意,但这种语法到底是什么?
- 它定义了"函数原型"还是函数指针?
- 如果是函数原型,函数指针和函数原型相同还是它们的行为相同?
- 如果它不是函数原型,那是否意味着"函数原型"只是函数的预先声明吗?
- 如果此语法等效于标准函数指针语法,为什么语法更冗长(可以说更难阅读)更常教授的形式?
- 语法是否产生不同的结果/具有不同的含义我不知何故没有注意到?
不,它们不一样。数组和指针不再相同,只是因为您可以将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())
— 结束示例 ] ...
该规则也适用于其他地方(不是完整列表):
- 非类型模板参数
- 模板参数推导
- 异常处理程序
相关文章:
- 函数如何通知用户它基于函数原型抛出异常?
- 在函数中拥有函数原型的目的是什么?
- 什么..(省略号)作为函数原型中唯一的函数参数,C++?
- 是否可以使用 libclang python 解析 cpp 文件中没有标头的函数原型
- 有没有办法在C++编译时更改函数原型?
- 省略函数原型中的返回类型
- 如何使用 "using" 关键字定义函数原型/签名
- 函数原型未初始化的局部变量
- 如何创建函数原型命名空间
- 标准库头文件函数原型的实现是如何用 c++ 编写的?
- 为什么这种类型的函数原型会引发错误?
- 函数指针类型不能用于函数原型
- 了解此函数原型
- 将字符串向量传递给函数和函数原型问题 c++
- 函数原型范围的有趣用法
- 为什么这不起作用(C++函数原型)
- 将数组传递到函数会在函数原型声明中出现错误
- 在头文件中的函数原型中获取指针数组:函数声明为 void
- 类/成员函数中的函数原型
- 函数原型中的字符串初始化