备用函数语法/函数原型?

时间:2016-01-23 07:46:55

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

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

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

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

我进一步挖了一下,发现an SO question似乎意味着它是一个'函数原型的语法'而不是函数指针。然而,wikipedia's explanation of function prototypes听起来很像预定义函数。

我为我的问题的广泛范围道歉,但这个语法究竟是什么?

  • 它是否定义了一个'功能原型'还是一个函数指针?
  • 如果它是函数原型,则是函数指针和函数 原型相同还是只是表现相同?
  • 如果它不是功能原型那就意味着功能原型' 只是函数的预先声明?
  • 如果此语法等效于标准函数指针 语法,为什么语法更冗长(也可能更难理解) 更常见的形式?
  • 语法产生不同的结果/具有不同的含义 我不知何故没有注意到?

1 个答案:

答案 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())
    
         

    - 结束示例] ...

  •   

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

  • 非类型模板参数
  • 模板参数演绎
  • 异常处理程序