备用函数语法/函数原型

Alternate function syntax/function prototypes?

本文关键字:函数 原型 语法 备用      更新时间:2023-10-16
我一直

在使用函数指针,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())
    

    结束示例 ] ...

该规则也适用于其他地方(不是完整列表):

  • 非类型模板参数
  • 模板参数推导
  • 异常处理程序