[英]Correct usage of exit() in c++?
我編寫了一個簡單的應用程序,它讀取數據文件,解析文本,然后對該數據進行一些處理。 數據文件在main()函數中打開。 如果確定文件未正確打開,使用exit()函數是否是一種很好的編程習慣? 例如:
if (!file.is_open() ){
exit(1);
}
此外,我的程序有一個單獨的函數來解析文件中的數據。 main()調用此函數。 如果函數在數據中發現錯誤,我希望程序在打印錯誤消息后停止。 在這種情況下,在我的解析函數中使用exit()函數是否可以接受? 我問這個問題是因為,對我來說,允許一個函數自己退出程序而不將控制返回到main()函數似乎並不是很整潔。 (如果這個問題看起來非常明顯,我道歉。我是C ++和編程的新手)。
調用函數exit
並不是“壞”,因為它具有明確定義的行為 - 這樣做沒有任何根本錯誤。
但是,如果您正在編寫一個可能最終存在於庫中的函數,那么從一般情況下調用exit
是一種不好的做法:向調用代碼發出錯誤信號要好得多(通過特定的返回值或異常,實例)並讓調用代碼決定做什么。 (有些情況下它完全有效。例如,如果您正在編寫一個名為quit_if_file_not_found
的函數,那么,您的用戶期望終止。)
在您的情況下,您的解析函數可能不應該調用exit
:例如,您可能希望在將來的某個時候,如果解析第一個文件名失敗,您的主代碼會要求用戶輸入不同的文件名。 如果解析例程終止程序,則必須修改主代碼和該函數。 如果它已發出錯誤信號,則您只需修改main
的邏輯。
(並且不要只是在沒有打印錯誤消息的情況下exit
或者記錄類似於您正在執行的操作,這將使那些無法知道如何解決代碼遇到的問題的沮喪用戶。)
有兩個方面。 一個是決定在你想要使用exit
的地方停止程序的興趣,另一個是退出的使用。 Mat的答案涵蓋了第一個。
對於第二種, exit
通常是C ++中的一個糟糕選擇。 原因是它做了一些清理(用atexit
注冊的函數,有時包括靜態存儲持續時間的某些對象的析構函數),但不是所有這些(堆棧中對象的析構函數),根據我的經驗,你要么全部都需要它或者沒有。
exit(0)
表示程序終止成功並且完全可移植,而
exit(1)
(通常)表示不成功終止。 但是,它的使用是不可移植的。
從main
, exit(1)
或return 1
沒有區別。 使用返回/退出值0
表示成功, 非 0
表示失敗。
如果您的子例程是一個在其他地方使用的庫例程,它應該使用一些返回代碼或異常將控制權返回給main。 否則,如果您exit
或退貨,這是您的選擇。
在任何一種情況下,最好記錄函數的功能, exit
, return
代碼或exception
。
這取決於exit(1)
來源。 您不應該從庫中調用此exit(1)
,只能從您自己的應用程序調用。
如果需要設置錯誤代碼,可以設置errno
(STD C變量,是)。
如果您想嘗試更多C ++方式,可以使用詳細的錯誤代碼拋出異常。
退出是可以接受的,雖然我認為重要的是要注意在退出中使用exit與return語句的內存差異不會破壞內存中的變量。 如果有錯誤,則退出是合理的。 否則,我會堅持退貨聲明。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.