2012-03-24 50 views
3

聲明:「內聯函數必須在調用之前定義。」內聯函數/方法

這句話是否正確?

[編輯]

問題是最初在德國:
直列FunktionenmüssenVOR ihrem Aufruf definiert盛。

也許它可以幫助任何人......

+2

有人不做作業 – Rps 2012-03-24 16:29:31

+0

我是,但它是在測試中,我仍然不知道這是否正確。 – dudade 2012-03-24 16:31:33

回答

5

是的,它是正確的,但只partly.It也許正確地重新框架如下:

「內聯函數必須在每個translation unit定義(但不一定在之前),他們被稱爲「。

C11 ++標準:§7.1.2.4

內聯函數應每翻譯單元在其被使用並應 具有完全相同的定義在每種情況下被定義[注:在其定義出現在翻譯單元中之前,可能會遇到對內聯函數的調用。 - 注意]

爲什麼這個原理?

當您聲明函數內聯基本上您正在告訴編譯器(如果可能)用調用該函數的函數的內容替換調用該函數的代碼。這個想法是,函數體可能很小,調用函數比函數本身的開銷更大。

爲了能夠做到這一點,編譯器需要在編譯調用函數的代碼時看到定義。通常,這是通過在inline說明符中添加頭中函數的定義,然後將頭文件包含在要調用該函數的每個cpp文件中完成的。

+2

我在您的報價單中看不到「之前」一詞,或者任何等價物。 – 2012-03-24 16:28:37

+0

@DavidGrayson:好的,我明白你的意思,我編輯了一下,以便適當地反映出來。 – 2012-03-24 16:41:13

+0

+1爲改進的答案。我想爲內聯函數添加另一個基本原理:它允許編譯器優化函數的主體。有時候,如果事先知道參數的價值是什麼,你可以將整個大型函數優化爲幾條指令。 – 2012-03-24 17:32:31

-1

該聲明沒有意義:內聯函數不再被調用,代碼僅存在於當前函數中(它已被「內聯」)。所以不,我會說這是不正確的。

+1

即使編譯後的代碼看起來不像函數調用,仍然可以通過編寫「foo()」來「調用」內聯函數。看起來你只是對「呼叫」這個詞進行人爲嚴格的定義。 – 2012-03-24 16:31:29

0

編號C++11 draft n3242比7.1.2小節4中較早的規範狀態更清楚;

內聯函數應德音響定義在每一個翻譯單元,其中 它是ODR-使用,而且必須在任何情況下 (3.2)有完全一樣去音響nition。 [注意:在翻譯單元中出現 其定義之前,可能會遇到對內聯函數的調用。 - 尾註]