主函数的返回值范围

标准对主要回报值的评价范围是什么? 只说最多255?

因为

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

标准不说。 0EXIT_SUCCESSEXIT_FAILURE有(某种)指定的含义。 还有什么依赖于实现。

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

正如其他人所说的那样,C&C ++标准除了声明(1) main返回一个int (它是一个实现定义的大小)和(2)零(或EXIT_SUCCESS )是一个成功的退货和EXIT_FAILURE是不成功的退货。 它确实指定了一个明确不返回值的主被视为返回了零。

在这种情况下,返回值的解释取决于主叫方( wait家庭中的某些东西)。 POSIX指定只有返回值的最低有效八位可用于等待的父进程 。 在分离一个subprocess之后,有人呼叫wait ,直到分叉进程完成(例如,从main返回,调用exitabort或其他)。 wait函数通过指向一个整数的指针返回状态 。 调用者使用WIFEXITED(status_val)WEXITSTATUS(status_val)macros提取实际的退出状态。 后者由POSIX定义,并要求返回状态参数的低8位

基本上,退出状态的价值在旁观者眼中 。 ANSI / ISO规范是开放式的。 POSIX标准套件将该值定义为8位数量, 尽pipe这在posix_spawn进一步的限制 。 贝壳有进一步限制结果值的习惯 。 FWIW,大多数人都认为限制你的返回值低于64似乎是安全的 。

在系统上,退出代码是一个介于0和255之间的数字。 你可以返回任何东西,但在Linux中它是256型。在这里看一看Linux返回代码的一个很好的解释。 还有关于这个主题的维基百科文章,其中关于Windows退出代码的讨论很less。

在Unix上,等待系统调用设置一个types为int的状态值,打包为一个位域,其中包含各种types的子终止信息。 如果孩子退出(由WIFEXITEDmacros确定;通常的替代scheme是由于未被捕获的信号而死),SUS指定状态值的低8位包含退出状态; 这可以使用wait.h中的WEXITSTATUSmacros进行检索。 因此,在Unix上,退出状态被限制为值0-255 ,即无符号8位整数的范围。

像系统一样,Unix通常使用一个成功的零规则,而不是零的错误规则。 对于各种错误代码的相对含义已经有了一些约定。 例如GNUbuild议将高位设置的代码保留为严重错误,FreeBSD已经logging了大量的首选解释。

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

有关详情,请参阅退出状态 wiki。

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

如果状态值为零或EXIT_SUCCESS ,则返回状态成功终止的实现定义forms。 如果状态值为EXIT_FAILURE ,则返回状态不成功终止的实现定义forms。 否则,返回的状态是实现定义的。

除了EXIT_SUCCESS / EXIT_FAILURE指南之外,其基本意思是“做任何你想做的事”。 :)

正如一个评论所说,在POSIX系统上,实际上只考虑了退出代码的低8位,这只是一个UNIX系统,从wait系统调用如何devise(退出状态必须打包在低8位的wait返回值),与C标准无关。

一个反例是Windows,其中整个值传递到exit / return被考虑(只要它不大于一个DWORD 1 ,但我不认为他们将永远不会比一个DWORD ,这将打破一个很多代码)。


1.由于为返回此值而保留的GetExitCodeProcess参数是DWORD *

你返回typesint 。 你应该能够返回任何可以存储在int 。 一个int的确切大小是依赖于实现的,所以我不能给你一个确切的范围。

5.1.2.2.3程序终止1如果主函数的返回types是与int兼容的types,则从初始调用返回到主函数相当于使用main函数返回的值调用exit函数作为其函数论据; 10)到达终止main函数的返回值为0.如果返回types与int不兼容,则返回到主机环境的终止状态未被指定

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

即没有要求它返回任何东西。 然而,它强调了通常的定义是什么。 几乎暗示他们是标准的,但有一个摆脱监狱免费卡,这意味着它可以是任何东西。