簡體   English   中英

在c ++中正確使用exit()?

[英]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) (通常)表示不成功終止。 但是,它的使用是不可移植的。

mainexit(1)return 1沒有區別。 使用返回/退出值0表示成功, 0表示失敗。

如果您的子例程是一個在其他地方使用的庫例程,它應該使用一些返回代碼或異常將控制權返回給main。 否則,如果您exit或退貨,這是您的選擇。

在任何一種情況下,最好記錄函數的功能, exitreturn代碼或exception

這取決於exit(1)來源。 您不應該從庫中調用此exit(1) ,只能從您自己的應用程序調用。

如果需要設置錯誤代碼,可以設置errno (STD C變量,是)。

如果您想嘗試更多C ++方式,可以使用詳細的錯誤代碼拋出異常。

退出是可以接受的,雖然我認為重要的是要注意在退出中使用exit與return語句的內存差異不會破壞內存中的變量。 如果有錯誤,則退出是合理的。 否則,我會堅持退貨聲明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM