22

标准对主要返回值范围有什么看法?说最多只有255?

因为

int main(void){
return 256;
}
echo $? ;  # out 0
4

7 回答 7

22

标准没有说。0EXIT_SUCCESS并且EXIT_FAILURE具有(某种)特定的含义。其他任何事情都取决于实施。

目前,大多数基于 Unix 的系统只支持 8 位返回值。Windows 支持(至少)一个 32 位的返回值。我没有检查 64 位 Windows 是否支持 64 位返回值,但我对此表示怀疑,因为即使 64 位 Windows 通常仍使用 32 位 int。

于 2011-03-01T00:38:01.503 回答
21

正如其他人所说,C & C++ 标准根本不限制返回值,只是声明

  1. main()返回一个int(具有实现定义的大小),并且
  2. 零(或EXIT_SUCCESS)是成功返回,EXIT_FAILURE是非成功返回。

它确实指定main()没有明确返回值的 a 被视为返回零。

在这种情况下,返回值的解释取决于等待进程完成的进程(通过调用wait()waitpid()waitid())。 wait()并且waitpid()是较旧的 POSIX 函数,它们指定只有返回值的最低有效八位可供等待的父进程使用。POSIX:2008 标准waitid()作为通用等待方法添加,可以访问子进程的完全退出状态。

在分叉出一个子进程之后,父进程调用其中一个wait*()函数进入休眠状态,直到分叉的进程完成(例如,从main()、调用exit()abort()其他东西返回)。wait()andwaitpid()函数通过指向整数的指针返回状态WIFEXITED(status_val)调用者使用和WEXITSTATUS(status_val)宏提取实际退出状态。后者由 POSIX 定义,需要返回status 参数的低 8 位。该waitid()函数使用指向siginfo_t结构的指针来返回进程的状态信息。该成员包含状态信息si_status中描述的完整状态值。

基本上,退出状态的值在旁观者的眼中。ANSI/ISO 规范是开放式的。POSIX 套件有多种方法可以等待进程完成并获取其退出状态。POSIX 还定义spawn()了一个轻量级版本,exec()它对退出状态值有自己的一组约束。Shell 有进一步限制结果值的习惯——GNU 的 bash将返回状态限制为 7 位,而符合 POSIX 的 shell将退出状态值限制为 8 位。FWIW,大多数人都同意将返回值限制为低于 64 似乎是安全的。

于 2011-03-01T00:59:18.220 回答
4

在类 Unix 系统上,退出代码是介于 0 和 255 之间的数字。你可以返回任何东西,但在 Linux 中它是 256 的。看看这里以获得关于 Linux 返回码的一个很好的解释。还有一篇关于该主题的 Wikipedia 文章简要介绍了 Windows 的退出代码。

于 2011-03-01T00:32:08.957 回答
3

C标准对退出代码没有特别的限制,关于main代表返回值的段落到关于函数的文档exit()中,反过来说:

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

除了EXIT_SUCCESS/EXIT_FAILURE准则之外,它基本上意味着“做任何你想做的事”。:)

正如在一条评论中所说,在 POSIX 系统上实际上只考虑退出代码的低 8 位这一事实只是一种 UNIX 主义,源于wait系统调用的设计方式(退出状态必须打包在返回值),与waitC 标准无关。

exit一个反例是 Windows,其中考虑了传递给/的整个值return(只要它不大于 a DWORD1,但我认为它们永远不会int大于 a DWORD,它会破坏很多代码)。


1.因为GetExitCodeProcess为返回这个值而保留的参数是a DWORD *

于 2011-03-01T00:45:42.100 回答
2

在 Unix 上,等待系统调用将 int 类型的状态值设置为包含各种类型的子终止信息的位域。如果孩子因退出而终止(由 WIFEXITED 宏确定;通常的选择是它死于未捕获的信号),SUS 指定状态值的低 8 位包含退出状态;这可以使用 wait.h 中的 WEXITSTATUS 宏来检索。因此,在 Unix 上,退出状态被限制为值 0-255,即无符号 8 位整数的范围。

类 Unix 系统通常使用零表示成功,非零表示错误。关于各种错误代码的相对含义已经形成了一些约定;例如 GNU 建议保留设置为高位的代码以用于严重错误,并且 FreeBSD 已经记录了一组广泛的首选解释。

C99 标准只定义了 0 和 1。但是,允许使用其他值。

有关更多信息,请参阅退出状态wiki。

于 2011-03-01T00:36:32.583 回答
0

你返回类型int。您应该能够返回任何可以存储在int. an 的确切大小int取决于实现,所以我不能给你一个确切的范围。

于 2011-03-01T00:32:12.900 回答
0

5.1.2.2.3 程序终止 1 如果主函数的返回类型是与 int 兼容的类型,则从初始调用主函数返回相当于以主函数返回的值作为其调用退出函数争论; 10)到达终止main函数的}返回值0。如果返回类型与int不兼容,则返回宿主环境的终止状态未指定

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf

即,它不需要返回任何东西。然而,它强烈地说明了通常的定义是什么。几乎暗示它们是标准的,但有一张免狱卡,这意味着它可以是任何东西。

于 2011-03-01T00:36:37.287 回答