2014-02-19 28 views
4

這裏是一個C++函數:當一個函數缺少返回值時,編譯器會生成一個警告但不會出錯?

int FuncWithoutReturn() 
{ 
    int var = 10; 
    ++var; 
    // No return value here !!! 
} 

在MSVC,編譯器會生成錯誤:

error C4716: 'FuncWithoutReturn' : must return a value.

但是XCode中5,編譯器只是吐出一個警告:

Control reaches end of non-void function

在運行時如果我很幸運,應用程序崩潰。我知道這是一個愚蠢的錯誤,但編譯器首先會產生錯誤會很好。

只是想知道任何人都知道爲什麼XCode認爲這是一個警告,而不是一個錯誤。

+0

感謝您的回答,但有沒有任何情況下缺少返回值是故意的?我的意思是我的情況,那是一個錯誤。但是因爲編譯器認爲這個錯誤是默認的警告。我認爲必須有一個原因,爲什麼... – r0ng

回答

5

你可以用-Werror=return-type來做出這個警告和錯誤,在我原來的評論中我忘了那個。你可以看到它live

這是clanggcc的一個選項,據我瞭解XCode可以使用任一個。

[...]Flowing off the end of a function is equivalent to a return with no value; this results in undefined behavior in a value-returning function.

未定義行爲不要求:

降降值返回函數是undefined behavior末,我們可以通過轉到draft C++ standard6.6.3return語句款它說看到這一個診斷(警告或錯誤),儘管在很多情況下編譯器會提供一個。

+0

標準,是的,這是我想知道的。謝謝。 – r0ng

2

可以使用-Werror=return-type

Just wondering anyone knows WHY XCode think it is a warning instead of an error.

檢查項目/目標的/ xcconfig的設置爲 「不匹配的返回類型」(又名GCC_WARN_ABOUT_RETURN_TYPE)啓用它。

1

只爲我的卑微的歷史,這只是我的歷史。

g ++ 4.9.2創建.o文件,在沒有返回語句的情況下運行良好。
鐺++ 3.5的.o與警告文件生成:「警告:控制到達非void函數的端[-Wreturn型]」

但在我的情況下:用鐺生成

  • 二進制++在運行時崩潰;

  • 用g ++生成的二進制文件在運行時不會崩潰;

我明白,這是一個未定義的行爲,你必須把return語句,但在鐺++的情況下,我希望他們會修改這個「警告」的「錯誤」,以幫助人們移植他們的代碼和同時清理它。

我有很多其他的警告與鏗鏘++這是好的,但這似乎是一個不僅僅是一個警告。
將代碼移植到clang ++,在這種情況下,對於像我這樣的人來說更多的工作,我不知道生成的代碼會因爲這個警告而被破壞,因爲基本上,它在許多g ++編譯器上工作正常。

相關問題