c++中exit()的正确用法



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

if (!file.is_open() ){
     exit(1);
}

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

从函数中调用exit并不"坏",因为它具有良好定义的行为-这样做没有什么根本错误。

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

在您的示例中,解析函数可能不应该调用exit:例如,在将来的某个时候,如果解析第一个文件名失败,您可能希望主代码向用户询问另一个文件名。如果解析例程终止程序,则必须修改主代码和该函数。如果它发出了错误信号,您只需要修改main中的逻辑。

(不要只是exit而不打印错误消息或记录类似您上面所做的事情,这将使沮丧的用户不知道如何解决代码遇到的任何问题)

有两个方面。一个是决定在您想要使用exit的地方停止程序的兴趣,另一个是退出的使用。马特的回答涵盖了第一个问题。

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

exit(0)表示程序成功终止&它是完全便携的,而

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

main来看,exit(1)return 1没有区别。使用返回/退出值0表示成功,使用 0表示失败。

如果你的子例程是一个库例程,在其他地方使用,它应该用一些返回代码或异常将控制权返回给main。否则,您可以选择exit或return。

在任何一种情况下,记录函数的功能是很好的做法,无论是exit, return代码还是exception

这取决于exit(1)来自哪里。您不应该从库中调用这个exit(1),而应该从您自己的应用程序中调用。

如果您需要设置一个错误码,您可以设置一个errno (STD C变量,是)。

如果你想尝试一种更c++的方式,你可以抛出一个异常,并附上详细的错误代码。

Exit是可以接受的,尽管我认为重要的是要注意使用Exit和return语句在内存中的区别,因为Exit不会破坏内存中的变量。如果有错误,那么退出是合理的。否则,我将坚持使用return语句。

相关内容

  • 没有找到相关文章

最新更新