主函数的返回值范围
标准对主要回报值的评价范围是什么? 只说最多255?
因为
int main(void){ return 256; } echo $? ; # out 0
标准不说。 0
, EXIT_SUCCESS
和EXIT_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
返回,调用exit
或abort
或其他)。 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
即没有要求它返回任何东西。 然而,它强调了通常的定义是什么。 几乎暗示他们是标准的,但有一个摆脱监狱免费卡,这意味着它可以是任何东西。