2016-01-23 115 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()) 
    

    端示例] ...

該規則適用於其他地方,以及(不是一個完整的列表):

  • 非型號模板參數
  • 模板參數推導
  • 異常處理