【问题标题】:EXIT_SUCCESS and EXIT_FAILURE. Is it compile once run anywhere or write once compile everywhere? [duplicate]EXIT_SUCCESS 和 EXIT_FAILURE。它是编译一次在任何地方运行还是一次编写到处编译? [复制]
【发布时间】:2012-10-23 14:19:07
【问题描述】:

可能重复:
(C/C++) return EXIT_SUCCESS or 0 from main?

很长一段时间我都在使用 return 0;,从我开始使用 allegro 开始。比我看到 C++ 书并找到关于 EXIT_SUCCESS 的信息,比我查看 stdlib.h 或 cstdlib 的定义要多,而且只有两行:

#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1

有人可以向我解释一下吗?我正在使用最后一个 devc++ 4.9.9.2 的 mingw 版本。

【问题讨论】:

  • 要解释什么?您通常应该从 main 返回 0 以指示成功和任何其他失败值。
  • 您可以使用其中任何一种,但是除非您使用 EXIT_FAILURE,否则没有标准的失败退出方式。见stackoverflow.com/questions/8867871/…
  • @chris 0 表示成功,但除了EXIT_FAILUREEXIT_SUCCESS 之外没有其他要求。即使在普通系统中:在 Unix 下,256 将被视为成功(因为操作系统只保留低位 8 位),而在其他系统中,没有限制:负值或奇数是失败,或者......当然还有:Unix 和 Windows 只是将这个值传递给调用程序。它按照自己的意愿解释它。 C++ 可以在这里表达一个意图,但是调用你的程序的程序不受 C++ 标准的约束。
  • @JamesKanze,是的,我应该更清楚。我是在一个调用你的程序的上下文中谈论的。按照惯例,零是成功,我不能谈论太多关于其他操作系统的经验,但 Windows 通常是失败的任何其他价值。
  • @chris 别担心。我有点迂腐。但事实上,C++标准只能规定C++,而其中涉及与外部环境交互的一切,实际上只能作为标准中的意图,因为C++标准不能规定外部环境。例如,它不能阻止我编写一个脚本来测试$? = 3 是否确定程序已经成功。 (但这显然 不是 Unix 世界的惯例。)

标签: c++ c return std exit-code


【解决方案1】:

C99 语言标准定义了两个宏 EXIT_SUCCESSEXIT_FAILURE 以扩展为“整数常量表达式,可以用作 exit 函数分别返回不成功或成功终止状态给 宿主环境”(§7.20/3)。

exit 函数的描述中(§7.20.4.3/5),它还说:

最后,控制权返回到宿主环境。如果status 的值为零或 EXIT_SUCCESS,状态成功终止的实现定义形式是 回来。如果status 的值为EXIT_FAILURE,则为实现定义的形式 返回状态不成功终止。否则返回的状态为 实现定义。

因此,如果您以 0 或 EXIT_SUCCESS 退出,则始终意味着主机环境“成功终止”。 EXIT_FAILURE 是一个始终表示“不成功终止”的值,但不保证除这些值之外的任何非零值都是可移植的。

请注意,从main 返回等效于调用具有返回值状态的exit 函数(第 5.1.2.2.3 节)。

【讨论】:

  • 关于从 main 中返回的说明在 C 中是 true,但在 C++ 中是 not true。 exit 不调用局部变量的析构函数。来自 main 的 return 与任何其他函数的 return 一样,将在对象超出范围时调用析构函数。
【解决方案2】:

EXIT_SUCCESSEXIT_FAILUREstdlib.h 中定义的标准C 宏。 C 没有指定这些宏的值。

POSIX 要求 EXIT_SUCCESS0。 (但没有为EXIT_FAILURE 值指定任何内容)。

【讨论】:

  • C 没有指定EXIT_SUCCESS 的值,但它确实 指定从main 返回0 具有相同的效果返回EXIT_SUCCESS平台(较旧的 VMS,如果没有记错的话)没有将 EXIT_SUCCESS 定义为零 并且没有将 main 返回零视为成功终止,但那是不符合标准。
  • @Zack 表示 EXIT_SUCCESS 的值可以是 42,即使值 0 表示成功终止。
  • 当然可以;我要说的是return 0; 来自main 是成功终止程序的一种完全一致的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
  • 2012-12-14
  • 2014-08-03
  • 2012-01-19
  • 1970-01-01
相关资源
最近更新 更多