問題:
開發人員在使用Windows 版g 時遇到意外行為透過草莓Perl 獲得。 g 編譯器允許他們在非 void 函數中省略 return 語句,儘管函數會傳回一個結構。
深入分析:
程式碼片段提供:
struct boundTag Box::getBound(int side) { struct boundTag retBoundTag; retBoundTag.box = this; switch (side) { // set retBoundTag.bound based on value of "side" } }
在這樣的非void 函數中,省略return 語句會導致未定義的行為。 ISO C -98 標準規定:
從函數末端流出相當於沒有值的回傳;這會導致在傳回值函數中未定義的行為。
為什麼編譯時沒有警告?
省略 return 語句時未定義行為,某些編譯器預設可能不會發出警告。為了啟用更徹底的警告,建議在編譯時使用 -Wall 選項。
省略 Return 語句的後果
在非-省略 return 語句void 函數可能會產生不可預測的後果。該函數可能會傳回未初始化的值或導致程式崩潰。另外,在後續程式碼中使用回傳值可能會導致意外結果。
結論
雖然g 編譯器允許在這種情況下省略return 語句,但遵守ISO C 標準並始終在非void 函數中包含return 語句至關重要。省略 return 語句可能會導致未定義的行為和不可預測的後果。
以上是為什麼我的 Cg 編譯器會編譯一個沒有 Return 語句的函數,即使它回傳一個結構體?的詳細內容。更多資訊請關注PHP中文網其他相關文章!