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

mah*_*007 22 c++ function exit

我编写了一个简单的应用程序,它读取数据文件,解析文本,然后对该数据进行一些处理.数据文件在main()函数中打开.如果确定文件未正确打开,使用exit()函数是否是一种很好的编程习惯?例如:

if (!file.is_open() ){
     exit(1);
}
Run Code Online (Sandbox Code Playgroud)

此外,我的程序有一个单独的函数来解析文件中的数据.main()调用此函数.如果函数在数据中发现错误,我希望程序在打印错误消息后停止.在这种情况下,在我的解析函数中使用exit()函数是否可以接受?我问这个问题是因为,对我来说,允许一个函数自己退出程序而不将控制返回到main()函数似乎并不是很整洁.(如果这个问题看起来非常明显,我道歉.我是C++和编程的新手).

Mat*_*Mat 17

exit从函数调用并不是"坏",因为它具有明确定义的行为 - 这样做没有任何根本性的错误.

但是,如果你正在编写一个可能最终存在于库中的函数,那么exit从那里调用通常是不好的做法:向调用代码发出错误信号要好得多(例如通过特定的返回值或异常) )让调用代码决定做什么.(有些情况下它完全有效.例如,如果您正在编写一个名为的函数quit_if_file_not_found,那么,您的用户期望终止.)

在您的情况下,您的解析函数可能不应该调用exit:例如,您可能希望在将来的某个时候,如果解析第一个文件名失败,您的主代码会要求用户提供不同的文件名.如果解析例程终止程序,则必须修改主代码和该函数.如果它已经发出错误信号,那么你只需要修改逻辑main.

(并且不仅exit不打印错误消息或记录您上面所做的事情,这将使那些无法知道如何解决代码遇到的问题的沮丧用户.)

  • 那么你需要改变它,使用"out参数",或使用异常.既可能失败又无法发出错误信号的功能是设计错误. (2认同)

APr*_*mer 6

有两个方面.一个是决定在你想要使用的地方停止程序的兴趣exit,另一个是退出的使用.Mat的答案涵盖了第一个.

对于第二种,exit在C++中通常是一个糟糕的选择.原因是它做了一些清理(注册的函数atexit,有时包括静态存储持续时间的某些对象的析构函数),但不是所有这些(堆栈中对象的析构函数),根据我的经验,你要么全部要么或者没有.


小智 3

exit(0)表示程序成功终止并且它是完全可移植的,同时

exit(1)(通常)表示终止失败。然而,它的使用是不可移植的。