EXIT_SUCCESS 和 EXIT_FAILURE。它是编译一次在任何地方运行还是一次编写到处编译? [复制]

Posted

技术标签:

【中文标题】EXIT_SUCCESS 和 EXIT_FAILURE。它是编译一次在任何地方运行还是一次编写到处编译? [复制]【英文标题】:EXIT_SUCCESS and EXIT_FAILURE. Is it compile once run anywhere or write once compile everywhere? [duplicate] 【发布时间】: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,否则没有标准的失败退出方式。见***.com/questions/8867871/… @chris 0 表示成功,但除了EXIT_FAILUREEXIT_SUCCESS 之外没有其他要求。即使在普通系统中:在 Unix 下,256 将被视为成功(因为操作系统只保留低位 8 位),而在其他系统中,没有限制:负值或奇数是失败,或者......当然还有:Unix 和 Windows 只是将这个值传递给调用程序。它按照自己的意愿解释它。 C++ 可以在这里表达一个意图,但是调用你的程序的程序不受 C++ 标准的约束。 @JamesKanze,是的,我应该更清楚。我是在一个调用你的程序的上下文中谈论的。按照惯例,零是成功,我不能谈论太多关于其他操作系统的经验,但 Windows 通常是失败的任何其他价值。 @chris 别担心。我有点迂腐。但事实上,C++标准只能规定C++,而其中涉及与外部环境交互的一切,实际上只能作为标准中的意图,因为C++标准不能规定外部环境。例如,它不能阻止我编写一个脚本来测试$? = 3 是否确定程序已经成功。 (但这显然 不是 Unix 世界的惯例。) 【参考方案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 是成功终止程序的一种完全一致的方式。

以上是关于EXIT_SUCCESS 和 EXIT_FAILURE。它是编译一次在任何地方运行还是一次编写到处编译? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

我应该从 main() 返回 EXIT_SUCCESS 还是 0?

EXIT_SUCCESS 和 EXIT_FAILURE。它是编译一次在任何地方运行还是一次编写到处编译? [复制]

为啥 main 的默认返回值为 0 而不是 EXIT_SUCCESS?

EXIT_SUCCESS EXIT_FAILURE

C语言基础:错误处理(errnoperror() 和 strerror()除数为0的错误程序退出状态 EXIT_SUCCESS)

linux系统调用:exit()与_exit()函数详解