標籤:

C++里一個帶有返回值的函數在沒有return語句的情況下在GCC里編譯通過是否可看作GCC的bug?


不能看作是 Bug。

---

因為「在有返回值的函數里不 return」屬於未定義行為:

§6.6.3/2 C++03 C++11 C++14

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.

而「未定義行為」沒有必要導致編譯失敗:

§1.3.13 C++03 / §1.3.24 C++11 C++14

Permissible undefined behavior ranges from ignoring the situation completely with unpredictable results, to behaving during translation or program execution in a documented manner characteristic of the environment (with or without the issuance of a diagnostic message), to terminating a translation or execution (with the issuance of a diagnostic message).

當然有一個特例就是 main,沒有 return 等於結尾有個 return 0:

§3.6.1/5 C++03 C++11 C++14

If control reaches the end of main without encountering a return statement, the effect is that of executing
return 0;

自然也就不會導致編譯失敗。


當然不算,clang裡面也只是warning而已,C/C++相信程序員會做正確的事。


不看做bug

如果 main 函數的最後沒有寫 return 語句的話,C99 規定編譯器要自動在生成的目標文件中(如 exe 文件)加入 return 0 ,表示程序正常退出。


推薦閱讀:

GCC中-O1 -O2 -O3 優化的原理是什麼?
int 在VS debug win32和debugx64下的區別?
一段程序在gcc 5.4下編譯後,執行發生段錯誤,在gcc 4.4.7下編譯後,執行正常,什麼原因?
C++在類模板中如何定義友元函數為同類型的模板函數?

TAG:C | CC | GCC | 編譯器 |