为什么在 C 和 C++ 中使用整数 return 值(例如 -1 或 0)?

Why are integer return values (such as -1 or 0) used in C and C++?

当我阅读 C 或 C++ 代码时,我经常注意到函数 return 整数值,例如 -10。我的问题是:为什么使用这些整数 return 值?

-1 似乎是 return 函数在无法执行其预期任务时被函数编辑了。那么这些值是否类似于 HTTP 响应状态代码?如果是这样,还有多少其他值存在,它们代表什么?

这种做法来自 C。由于 C 不支持异常,因此程序员经常使用 return 值作为 status 来指示函数是否成功。有些程序使用 errorstatus 参数,并将它们适当地设置为错误或状态代码。

在 C++ 中,当抛出异常不合适时,状态代码用作处理运行时错误的一种方式。如果您的函数可能在不方便的情况下失败(例如,within a destructor),您可以 return 函数中的状态代码而不是抛出,因此可以安全地消除错误。

没有关于如何实现状态代码的标准或指南,通常它取决于程序员。如果您有兴趣了解这些状态代码的含义,您应该查看您正在使用的 application/library 的参考资料。

我假设您指的是 main 的 return 值。这是 C++ 标准对它的描述:

[basic.start.main]

A return statement ([stmt.return]) in main has the effect of leaving the main function (destroying any objects with automatic storage duration) and calling std​::​exit with the return value as the argument.


[support.start.term]

[[noreturn]] void exit(int status);

Effects:

  • ...
  • Finally, control is returned to the host environment. If status is zero or EXIT_­SUCCESS, an implementation-defined form of the status successful termination is returned. If status is EXIT_­FAILURE, an implementation-defined form of the status unsuccessful termination is returned. Otherwise the status returned is implementation-defined.

因此,return 值的含义主要是 implementation-defined。

许多操作系统(如Linux、Windows、Mac等)shell都有“退出状态码”的概念。通常,C++ 的实现转发 returned 值作为退出状态代码。这种状态的含义可能取决于程序运行的环境。

例如,bash(Linux的shell)的手册是这样说的:

... Exit statuses fall between 0 and 255, though, as explained below, the shell may use values above 125 specially. ...

For the shell’s purposes, a command which exits with a zero exit status has succeeded. A non-zero exit status indicates failure.

早期数字计算的传统,原因是将累加器设置为零会自动设置处理器零标志 - 这可以通过条件分支指令简单地检查。其他值在分支之前需要额外的算术指令。因此,如果只需要检查是否存在错误,零检查将非常便宜。其他值可以记录为错误标识号,特殊值 -1 作为未记录错误的通用代码。在 2 的补码机器上 - 主要架构 - -1 的值将所有位设置为 1:零的逻辑逆。特定的指令序列也可能导致设置特定的处理器标志,这将简化对 -1 的检查,如零。 现在有更复杂的错误处理机制。最著名的是 try-throw-catch 异常处理。但我们通常建议不要以这种方式使用异常。因为它使设计复杂化并产生开发周期问题。更好的解决方案可以受益于 std::error_conditionstd::optionalstd::expected。后者是对前两个使用 C++23 的征服。