为啥超过 255 的返回码在 C++ 中返回不同的数字?

Posted

技术标签:

【中文标题】为啥超过 255 的返回码在 C++ 中返回不同的数字?【英文标题】:Why do return codes over 255 return a differnt number in C++?为什么超过 255 的返回码在 C++ 中返回不同的数字? 【发布时间】:2016-01-20 23:23:40 【问题描述】:

例如...

#include <iostream>

using namespace std;

int main()return 300;

返回:

Process finished with exit code 44

??

【问题讨论】:

它只占用 8 位。 300 &amp; 0xff == 44。很确定这主要是 Unix 的东西。请参阅 waitpid 联机帮助页中的 WEXITSTATUS - 状态是 OR'd 到其他一些值。 你能解释一下原因吗?是否可以返回更高的数字? 没有超过 255 的返回码。操作系统会忽略前八位之外的任何位。 或许值得指出的是,这只适用于程序的返回码。显然,非主函数可以返回任何他们喜欢的东西。通常程序返回码只是用于错误处理,所以 255 个值就足够了(您的实际输出通常应该转到标准输出,以便可以通过管道传输) 进程返回码的处理将取决于操作系统,而 C++ 标准基本上只是说实现定义了发生的事情。 【参考方案1】:

标准只知道两个标准化的返回值:EXIT_SUCCESS(或零)和EXIT_- FAILURE

3.6.1/5 main 中的 return 语句具有离开 main 函数的效果(销毁任何具有自动存储持续时间的对象)和 以返回值作为参数调用 std::exit

18.5/8 (...) 最后,控制权返回到宿主环境。如果状态为零或EXIT_SUCCESS,则状态的实现定义形式 返回成功终止。如果状态为EXIT_- FAILURE,则 状态不成功终止的实现定义形式是 回来。 否则返回的状态是实现定义的

因此不能保证任何其他整数都按原样返回。

以MS Windows 为例,GetExitCodeProcess() 函数返回整数值,因此您将得到 300。

在POSIX 兼容系统上,例如Linux,规则是(“只有 8 个最低有效位(即状态和 0377)可供等待的父进程使用”) .所以对于 300,它将是 44。

【讨论】:

其实在unix下,退出码在MSB中,所以(status &amp; 0xff00) &gt;&gt; 8。只有 8 位的原因是历史原因:在原始 unix [为 PDP-11 开发] 下,int 是 16 位,因此在status 中没有空间为wait 提供更大的错误代码。为了向后兼容,错误代码的大小没有增加,尽管现在大多数拱门将int 定义为 32 位实体。如前所述,由于程序返回的代码通过操作系统并由父级从系统调用中获取,因此它取决于操作系统类型 @CraigEstey 有趣,谢谢!事实上,我在“unix 操作系统的设计”中发现了一条注释,解释了传递给exit() 的低 8 位存储在内部进程返回码的第 8 到 15 位中,如您所说。我想这就是为什么从wait() 获得的返回码必须用WIFEXITED()WEXITSTATUS() 等正确解释的原因......而system() 的返回也是如此。 感谢@HansPassant 的更新。事实上exit() 的 Windows 文档说“状态的低位字节可供主机环境使用”,但测试表明始终返回完整整数,正如您所说关于GetExitCodeProcess()。即使使用旧版execlp(),也会发生这种情况。所以似乎没有“仅”这个词被解释为“最低字节或更多”:-)

以上是关于为啥超过 255 的返回码在 C++ 中返回不同的数字?的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本或C程序返回值为什么不能大于255

C++里面,为啥重载前++时不返回引用就不能连用?

为啥 tinyint 在 MySQL 中不能存储超过 255 的数字?

为啥 MySql 会出现“子查询返回超过 1 行”错误?

为啥 char** 不能成为 C++ 中以下函数的返回类型?

为啥 Youtube/Google API 不返回超过 5 个回复?