基礎知識 | 每日一面(70)
- 2020 年 4 月 2 日
- 筆記

古代的劍客們與
對手相逢時,無
論對手多麼強大,
明知不敵,也要亮出自己的劍!
讀者:我覺得把 main() 聲明為 void 不會失敗, 因為我調用了 exit()
而不是 return , 況且我的作業系統也忽略了程式的退出/返回狀態。
小林:這跟 main() 函數返回與否, 或者是否使用返回狀態都沒有關係; 問題是如果main() 聲明得不對, 它的調用者 (運行期初始程式碼) 可能甚至都不能正確調用它。你的作業系統可能會忽略退出狀態, 而 void main() 在你那裡也可能可行, 但這不可移植而且不正確。
讀者:那麼到底會出什麼問題?真的有什麼系統不支援 void main()
嗎?
小林:有人報告用 BC++4.5 編譯的使用 void main() 的程式會崩潰。某些編譯器(包括 DEC C V4.1 和打開某些選項的 gcc) 會對 void main() 提出警告。
讀者:我一直用的那本書總是使用 void main()。
小林:可能這本書的作者把自己也歸為目標讀者的一員。很多書不負責任地在例子中使用 void main(), 並宣稱這樣是正確的。但他們錯了。
讀者:從 main() 中, exit(status) 和返回同樣的 status 真的等價嗎?
小林:是也不是。標準聲稱它們等價。但是如果在退出的時候需要使用 main() 的局部數據, 那麼從 main() return 恐怕就不行了。少數非常古老不符合標準的系統可能對其中的某種形式有問題。最後, 在 main() 函數的遞歸調用時,二者顯然不能等價。
有時候,正是那些意想不到之人,成就了無人能成之事。
——圖靈