【问题标题】:Alternate function syntax/function prototypes?替代函数语法/函数原型?
【发布时间】:2016-01-23 07:46:55
【问题描述】:

我一直在 C++ 中使用函数指针,我一直将它们声明为void (*function)(void)。这是我最初在教程和how tutorials still teach it 中看到的。

但是今天,我在阅读维基百科关于高阶函数的文章时发现了一个使用替代语法的示例,其中 * 和围绕函数指针的变量/类型名称的括号不存在,如 here .

我测试了void function(void) 表单是否适用于变量、参数和类型定义。它不适用于变量,但它适用于没有明显变化的参数和类型定义,实际上可以与标准函数指针语法互换。

我进一步挖掘并发现an SO question 似乎暗示它是“函数原型”而不是函数指针的语法。不过wikipedia's explanation of function prototypes 听起来很像预先声明函数。

对于我的问题范围很广,我深表歉意,但是这个语法到底是什么?

  • 它定义了“函数原型”还是函数指针?
  • 如果是函数原型,是函数指针和函数 原型相同还是只是行为相同?
  • 如果不是函数原型,是否意味着“函数原型” 只是功能的预先声明?
  • 如果此语法等价于标准函数指针 语法,为什么更冗长(并且可以说更难阅读)的语法 更常用的教学形式?
  • 语法是否产生不同的结果/具有不同的含义 而我不知何故没有注意到?

【问题讨论】:

  • 在手机上,所以不会写一个完整的答案,但你展示的语法只能在 typedef 中使用。有点乱!
  • 您经常看到函数指针的一个地方是作为参数 (void(*param)())。这是写void param() 的一种情况,就像int[N] 作为函数参数实际上是int*,但在其他地方不同。
  • @chris 我只是仔细检查了一下,似乎我确实忘记测试变量大小写。当我开始做更多的研究和写这个问题时,我已经写到一半了,所以我忘记了我实际上并没有按下编译按钮。我现在已经修正了我的问题中的那个错误。

标签: c++ syntax function-pointers function-prototypes


【解决方案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())
    

    ——结束示例] ...

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

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

【讨论】:

    猜你喜欢
    • 2021-10-17
    • 2012-12-14
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多