2014-03-06 77 views
4

我很驚訝包含以下代碼行的文件已成功編譯並且鏈接器生成可執行文件。我認爲除main之外的所有功能都必須具有有效的return聲明,除非返回類型爲void是否有C++函數的默認返回值?

int foo(){} 
double bar(){} 
int main(){} 

我在想什麼?

+2

http://stackoverflow.com/questions/1610030/why-can-you-return-from-a-non-void-function-without-returning-a-value-without-pr –

回答

2

我認爲除main之外的所有函數都必須有一個有效的返回語句,除非返回類型爲void

是的,他們必須。如果他們不這樣做,你會得到未定義的行爲。

我錯過了什麼?

如果函數足夠複雜,編譯器可能很難或不可能判斷所有返回路徑是否返回一個值;所以編譯器不需要診斷錯誤。

如果啓用警告,大多數編譯器在很多情況下都會發出警告。

+1

我覺得這是對於靜態分析儀來說是一個很好的用例。 – 2014-03-06 19:51:06

+0

@faranwath:確實;雖然一個好的編譯器應該包含這個分析,但並不總是可以靜態檢測。 –

+2

我發現你最後的評論有趣。謹慎分享一個例子?我想不出從頭到尾的可能情況。 – 2014-03-06 19:55:40

8

不從函數返回一個值表示它是未定義的行爲。它編譯和鏈接,但不要指望程序行爲正確。

如果編譯時的警告級別很高,編譯器會告訴你。