主要回报值范围的标准说明是什么? 最多只说255?
因为
int main(void){
return 256;
}
echo $? ; # out 0
答案 0 :(得分:18)
标准没有说。 0
,EXIT_SUCCESS
和EXIT_FAILURE
具有(某种)指定的含义。其他任何事情都取决于实施。
目前,大多数基于Unix的系统仅支持8位返回值。 Windows支持(至少)32位返回值。我没有检查64位Windows是否支持64位返回值,但我对此表示怀疑,因为即使是64位Windows通常仍然使用32位int。
答案 1 :(得分:14)
正如其他人所说,C&除了声明(1)main
返回int
(具有实现定义的大小)和(2)零(或{{1})之外,C ++标准不会约束返回值。 })是成功的返回,EXIT_SUCCESS
是非成功的返回。它确实指定明确不返回值的EXIT_FAILURE
被视为返回零。
在这种情况下,返回值的解释取决于等待流程完成的流程(通过调用wait,waitpid或waitid)。 wait和waitpid是较旧的POSIX函数,它们仅指定the least significant eight bits of the return value shall be available to a waiting parent process。 POSIX:2008标准添加了waitid作为通用等待方法,可以访问子进程的完全退出状态。
在分离子进程之后,另一个进程调用其中一个 wait 函数进入休眠状态,直到分叉进程完成(例如,从main
返回,调用main
或exit
或其他)。 wait和waitpid函数通过指向整数的指针返回 status 。调用者使用abort
和WIFEXITED(status_val)
宏提取实际退出状态。后者由POSIX定义,并且需要返回the low-order 8 bits of the status argument。 waitid函数使用指向WEXITSTATUS(status_val)
结构的指针来返回进程的状态信息。 siginfo_t
成员包含Status Information中描述的完整状态值。
基本上,退出状态的值位于旁观者的眼中。 ANSI / ISO规范是开放式的。 POSIX套件有多种方法可以等待进程完成并获取其退出状态。 POSIX还将spawn定义为si_status
的轻量级版本,它对退出状态值有自己的一组约束。 Shell有习惯进一步限制结果值 - GNU's bash将返回状态限制为7位,将POSIX-compliant shell限制退出状态值限制为8位。 FWIW,大多数人同意将您的返回值限制为lower than 64 seems to be safe。
答案 2 :(得分:4)
退出代码是Unix类似系统的0到255之间的数字。您可以返回任何内容,但在Linux中它已修改为256.请查看here以获得有关Linux返回代码的详细说明。还有一个Wikipedia article on the topic,它简单地讨论了Windows的退出代码。
答案 3 :(得分:3)
C标准不对退出代码施加特殊限制,关于main
代表返回值的段落关于exit()
函数的文档,后者反过来说:
除了如果status的值为零或
EXIT_SUCCESS
,则返回状态成功终止的实现定义形式。如果status的值为EXIT_FAILURE
,则返回状态为不成功终止的实现定义形式。否则返回的状态是实现定义的。
EXIT_SUCCESS
/ EXIT_FAILURE
指南之外,基本上意味着“做你想做的事”。 :)
正如在一篇评论中所说,在POSIX系统上只实际考虑退出代码的低8位只是一种UNIX主义,这源于wait
系统调用的设计方式(退出状态必须被打包在wait
返回值的低8位,并且与C标准无关。
反例是Windows,其中考虑了传递给exit
/ return
的整个值(只要它不大于DWORD
1 ,但我不认为它们会使int
大于DWORD
,它会破坏很多代码。)
<小时/> 1.因为为返回此值而保留的
GetExitCodeProcess
参数为DWORD *
。
答案 4 :(得分:2)
在Unix上,等待系统调用设置了一个 int类型的状态值打包为 与各种类型的孩子的位域 终止信息。如果孩子 退出终止(已确定 由WIFEXITED宏;通常 替代方案是它死于一个 未指定信号),SUS指定 状态值的低8位 包含退出状态;这个可以 使用WEXITSTATUS检索 在wait.h中的宏。因此,在Unix上 退出状态仅限于值 0-255 ,无符号8位的范围 整数。
类似Unix的系统通常使用 成功与否的惯例 零错误。一些惯例 已经发展了亲戚 各种错误代码的含义;对于 示例GNU建议使用代码 高位设置保留 严重的错误,和FreeBSD有关 记录了一整套 首选解释。
C99标准仅定义0和1.但是,允许使用其他值。
有关详情,请参阅Exit Status wiki。
答案 5 :(得分:0)
您返回类型int
。您应该能够返回可以存储在int
中的任何值。 int
的确切大小取决于实现,因此我无法给出确切的范围。
答案 6 :(得分:0)
5.1.2.2.3程序终止1如果主函数的返回类型是a 类型与int兼容,返回 从最初的电话到主要 函数相当于调用 退出函数的退出函数 以主函数为参数; 10)到达终止的 main函数返回值0.如果 返回类型不兼容 int,返回终止状态 到主机环境是未指定的
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf
即,没有要求它返回任何东西。然而,它强烈地说明了通常的定义是什么。几乎暗示他们是标准的,但有一个免于监狱的卡,这意味着它可以是任何东西。