[英]Is a return statement mandatory for C++ functions that do not return void?
我的Herb Schildt關於C ++的書說:“ ...在C ++中,如果一個函數聲明為返回值,則它必須返回一個值。” 但是,如果我編寫的函數具有非空返回類型並且不返回任何內容,則編譯器會發出警告而不是錯誤:“控制到達非空函數的末尾。”
我使用gcc(MinGW)並設置了-pedantic標志。
§6.6.3/ 2:
從函數末尾流出就等於沒有值的返回; 這導致返回值函數中的行為不確定。
因此,這取決於您對強制性的定義。 一定要嗎 否。但是,如果您希望程序具有良好定義的行為,則可以。*
* main
是一個例外,請參閱第3.6.1 / 5節。 如果控制到達main
的末尾而沒有return
,則它將具有return 0;
的效果return 0;
。
這是強制性的-當此類函數結束而不返回任何內容時,這是未定義的行為(因此,編譯器實際上可能實現某種特殊的行為)。 但是,有一些特殊情況。
::main
是一個例外,假定return 0;
在其代碼的末尾。
同樣,您不必在函數中返回的值不會干凈地返回,例如:
int Foo() {
throw 42;
}
在聲明為返回非空的函數中包含return語句不是強制性的,也不必導致未定義的行為。
這樣的功能可以:
std::terminate
當然,如果函數始終通過執行上述操作之一來避免未定義的行為,則可能的話,可能不應該將其聲明為返回非無效。
一個明顯需要的情況是,它是一個虛函數,對於類層次結構中的特定點,該虛函數不能返回有效值,並且總是通過異常退出。
它是強制性的嗎? 我不這么認為,但是根據我對c ++標准的理解,未在非無效返回函數中不返回值是不確定的(除了main,它返回0)。
這是否還可以? 可能不是-如果該函數應該返回一個值,那么您應該返回一個值,這在復雜的代碼庫中可能會造成混亂。
忘記在值返回函數的某些控制路徑中包含return
語句不會使您的代碼格式錯誤。 也就是說,您通常應該期望代碼能夠編譯(可能帶有警告)。 從這個意義上講,它不是“強制性的”。
但是,實際上在C ++中從值返回函數的末尾流出始終是未定義的行為。 (在C語言中,僅當調用代碼實際使用結果時,這才是未定義的行為。)
就像GMan所說的那樣,唯一的例外是主要功能。 我仍然看到大量的書本都返回0,這並不是真正必要的。 哦,我想這可能會更糟,您可能正在學習使用void main()而不是int main()的書。 但是我認為您應該從所有這些中學到的東西是您的編譯器在抱怨一個原因,並且很好地注意到了這一點,因為從長遠來看,它通常可以使您免除頭痛。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.