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_FAILURE
和EXIT_SUCCESS
之外没有其他要求。即使在普通系统中:在 Unix 下,256
将被视为成功(因为操作系统只保留低位 8 位),而在其他系统中,没有限制:负值或奇数是失败,或者......当然还有:Unix 和 Windows 只是将这个值传递给调用程序。它按照自己的意愿解释它。 C++ 可以在这里表达一个意图,但是调用你的程序的程序不受 C++ 标准的约束。
@JamesKanze,是的,我应该更清楚。我是在一个调用你的程序的上下文中谈论的。按照惯例,零是成功,我不能谈论太多关于其他操作系统的经验,但 Windows 通常是失败的任何其他价值。
@chris 别担心。我有点迂腐。但事实上,C++标准只能规定C++,而其中涉及与外部环境交互的一切,实际上只能作为标准中的意图,因为C++标准不能规定外部环境。例如,它不能阻止我编写一个脚本来测试$? = 3
是否确定程序已经成功。 (但这显然 不是 Unix 世界的惯例。)
【参考方案1】:
C99 语言标准定义了两个宏 EXIT_SUCCESS
和 EXIT_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_SUCCESS
和EXIT_FAILURE
是stdlib.h
中定义的标准C 宏。 C 没有指定这些宏的值。
POSIX 要求 EXIT_SUCCESS
为 0
。 (但没有为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?
C语言基础:错误处理(errnoperror() 和 strerror()除数为0的错误程序退出状态 EXIT_SUCCESS)