為什麼這個 C 程式碼片段在缺少回傳值的情況下仍能編譯?
在提供的程式碼片段中:
static tvec4 Min(const tvec4& a, const tvec4& b, tvec4& out) { tvec3::Min(a, b, out); out.w = min(a.w, b.w); }
函數 Min 被宣告為傳回 tvec4,但程式碼未提供明確回傳語句。這就提出了一個問題,為什麼編譯器編譯程式碼時沒有錯誤。
未定義的行為
根據 C 11 草案標準,從值的末尾流出-返回函數而不提供返回值會導致未定義的行為。這意味著編譯器在這種情況下沒有義務發出錯誤或警告。
編譯器選項
但是,編譯器可以設定為警告甚至產生錯誤對於未定義的行為。例如,使用 -Wall 標誌通常會觸發以下警告:
warning: control reaches end of non-void function [-Wreturn-type]
透過新增 -Werror=return-type 標誌,編譯器會將此警告視為錯誤,強製程式碼已修正。
Visual Studio
在Visual Studio 中,程式碼會產生錯誤預設為C4716:
error C4716: 'Min' : must return a value
如果並非所有程式碼路徑都傳回值,Visual Studio 將發出警告(C4715)。
以上是儘管聲明了返回類型,為什麼 C 函數在沒有明確返回語句的情況下編譯?的詳細內容。更多資訊請關注PHP中文網其他相關文章!