23

ISO 1998 c++ 标准指定在 main 中不显式使用 return 语句等效于使用return 0. 但是,如果一个实现有不同的标准“无错误”代码,例如,-1怎么办?

为什么不使用标准宏,该宏EXIT_SUCCESS将被替换为0-1任何其他值,具体取决于实现?

C++ 似乎强制了程序的语义,这不是只应描述程序行为方式的语言的角色。此外,“错误”返回值的情况有所不同:只有EXIT_FAILURE标准的“错误”终止标志,没有明确的值,例如“1”。

这些选择的原因是什么?

4

9 回答 9

35

从返回零与main()您所要求的基本相同。从返回零main()不必将零返回到主机环境。

来自 C90/C99/C++98 标准文档:

如果 status 的值为 0 或EXIT_SUCCESS,则返回实现定义的状态成功终止形式。

于 2009-07-27T14:25:43.420 回答
18

实际上,return 0不一定会返回 0!我在这里引用 C 标准,因为这是我最了解的。

关于:return_main()

5.1.2.2.3 程序终止

如果 main 函数的返回类型是兼容的类型int,则从函数的初始调用返回main相当于以exit函数返回的值main作为参数调用函数;

关于exit()

7.20.4.3 退出函数
概要

#include <stdlib.h>
void exit(int status);

[...]
最后,控制权返回到宿主环境。如果 的值为status0 或 ,则返回成功终止EXIT_SUCCESS状态的实现定义形式。

于 2009-07-27T14:28:41.590 回答
5

该标准只是在未明确设置时确定必须是什么值。由开发人员明确设置返回值或为默认值假定适当的语义。我不认为该语言试图将任何语义强加给开发人员。

于 2009-07-27T14:08:47.393 回答
4

0 是所有 POSIX 系统以及我所知道的所有系统上的标准(成功)退出代码!我认为从一开始就是这种方式(或者至少从 Unix 开始......)所以我会说这是出于这个原因。

你知道什么系统是不同的?

于 2009-07-27T14:07:12.200 回答
3

0 作为成功的返回码,正整数作为错误是 C 和 Unix 中的标准。选择这个方案是因为通常人们并不关心程序为什么成功,只关心它成功了。另一方面,程序因错误而失败的方式有很多,人们通常对这些信息感兴趣。因此,使用标量值表示成功,使用范围值表示错误是有意义的。使用正整数是一种节省内存的 C 约定,因为它们允许将错误代码定义为无符号整数。

于 2009-07-27T14:27:31.373 回答
3

OS/360 和后续版本使用数字退出代码,0通常是成功,4用于警告(例如生成警告消息的编译器)、8错误和12特别严重的错误(例如无法打开标准输出单元 SYSPRINT) .

于 2010-05-23T02:01:12.240 回答
1

计算机语言标准说明了用该语言编写的程序必须做什么,以及会发生什么。在这种情况下,C 和 C++ 标准表示返回 0 表示成功等。

语言实现允许程序在特定实现上运行。实现者的工作是弄清楚如何使 I/O 符合标准,或者为操作系统提供正确的结果代码。

程序所做的和操作系统看到的不一定是同一件事。所需要的只是程序在给定的操作系统上按照标准所说的那样工作。

于 2009-07-27T14:56:46.147 回答
1

通过浏览cstdlib,我最终得到了两行:

#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1

So EXIT_SUCCESS equals 0, and EXIT_FAILURE equals 1, which means it doesn't matter, thought.

Checked on Linux (OpenSuse) and ended up with the same thing.

于 2013-10-06T13:20:34.953 回答
0

如果您还在考虑为什么成功的错误代码是 0 而不是任何其他值,我会补充说,从历史上看,这可能是出于性能原因,因为与 0 相比要快得多(我认为在现代架构中可能是与任何数字相同)并且通常您不会检查特定的错误代码,只要它是成功或任何错误(因此使用最快的比较是有意义的)。

于 2009-07-27T14:14:09.883 回答