2016-01-23 106 views
1

我一直在C++中使用函数指针,我一直声明它们为void (*function)(void)。这是我最初在教程和how tutorials still teach it中看到的。今天替代函数语法/函数原型?

但是,我正在读维基百科文章关于高阶函数时,我使用的是备用的语法,其中*和包围该函数指针的变量/类型名称的括号不存在发现了一个例子,如图here

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

我挖了一点,发现an SO question似乎暗示它是'函数原型'而不是函数指针的语法。然而wikipedia's explanation of function prototypes听起来很像只是预先声明的函数。

对于我的问题的广泛范围,我很抱歉,但是这个语法究竟是什么?

  • 它定义了“函数原型”还是函数指针?
  • 如果它是一个函数原型,函数指针和功能 原型相同还是它们只是表现相同?
  • 如果它不是一个函数原型那是否意味着'函数原型' 只是函数的预先声明?
  • 如果此语法与标准函数指针 的语法等效,为什么更常用的教学形式是更详细的(并且可以说难以阅读)语法 ?
  • 语法是否产生不同的结果/有不同的含义 和我有点不知道?
+0

在移动所以不打算写一个完整的答案,但你展示语法仅在typedef工作。这一切都是一团糟! –

+0

你经常看到函数指针的地方是一个参数('void(* param)()')。这是写'void param()'的一种情况,它的作用与'int [N]'相同,因为函数参数实际上是'int *',但在其他地方不同。 – chris

+0

@chris我只是双重检查,似乎我忘了测试变量的情况。当我开始进行更多的研究并编写这个问题时,我写了一半的内容,所以我忘了我没有真正按下编译按钮。我已经在我的问题中解决了这个错误。 – Pharap

回答

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

    端示例] ...

该规则适用于其他地方,以及(不是一个完整的列表):

  • 非型号模板参数
  • 模板参数推导
  • 异常处理