【问题标题】:Correct usage of exit() in c++?在 C++ 中正确使用 exit()?
【发布时间】:2012-12-16 01:42:14
【问题描述】:

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

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

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

【问题讨论】:

  • 我不明白这个问题。您打算正常终止程序吗?因为如果是这样,我可以在这里看到没有任何问题。

标签: c++ function exit


【解决方案1】:

exit(0) 表示程序成功终止且完全可移植,而

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

【讨论】:

  • 你能举一个例子说明它的用法是不可移植的吗?
  • @Rapptz:这个在this answer末尾讨论。
  • @Johnsyweb 谢谢。我知道 return 0return n 与 n != 0 之间的区别,但不清楚它如何应用于 std::exit 所以我想现在我知道了。
  • @Rapptz: return n in int main() 调用 std::exit(n) :-)
【解决方案2】:

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

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

在任何一种情况下,记录函数的作用都是很好的做法,无论是exitreturn 代码还是exception

【讨论】:

    【解决方案3】:

    这取决于exit(1) 的来源。你不应该从库中调用这个exit(1),只能从你自己的应用程序中调用。

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

    如果你想尝试更C++的方式,可以抛出异常,带有详细的错误代码。

    【讨论】:

      【解决方案4】:

      从函数调用 exit 并不是“坏”,因为它具有明确定义的行为 - 这样做从根本上没有错。

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

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

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

      【讨论】:

      • 我的函数返回类型是 void.. 所以我不能返回任何表示错误的东西。
      • 那么你需要改变它,使用“out 参数”,或者使用异常。既可能失败又无法发出错误信号的函数是设计错误。
      【解决方案5】:

      有两个方面。一是利益决定程序停在你要使用的地方exit,二是使用exit。 Mat's answer 覆盖第一个。

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

      【讨论】:

        【解决方案6】:

        Exit 是可以接受的,尽管我认为重要的是要注意使用 exit 与 return 语句在内存中的差异,退出不会破坏内存中的变量。如果有一些错误,那么退出是合理的。否则,我会坚持返回声明。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-12
          • 1970-01-01
          • 1970-01-01
          • 2016-08-19
          • 1970-01-01
          • 2011-08-30
          • 2015-06-09
          • 2013-10-30
          相关资源
          最近更新 更多