为什么在 C 和 C++ 中使用整数 return 值(例如 -1 或 0)?
Why are integer return values (such as -1 or 0) used in C and C++?
当我阅读 C 或 C++ 代码时,我经常注意到函数 return 整数值,例如 -1
或 0
。我的问题是:为什么使用这些整数 return 值?
-1
似乎是 return 函数在无法执行其预期任务时被函数编辑了。那么这些值是否类似于 HTTP 响应状态代码?如果是这样,还有多少其他值存在,它们代表什么?
这种做法来自 C。由于 C 不支持异常,因此程序员经常使用 return 值作为 status 来指示函数是否成功。有些程序使用 error
或 status
参数,并将它们适当地设置为错误或状态代码。
在 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_condition
、std::optional
或 std::expected
。后者是对前两个使用 C++23 的征服。
当我阅读 C 或 C++ 代码时,我经常注意到函数 return 整数值,例如 -1
或 0
。我的问题是:为什么使用这些整数 return 值?
-1
似乎是 return 函数在无法执行其预期任务时被函数编辑了。那么这些值是否类似于 HTTP 响应状态代码?如果是这样,还有多少其他值存在,它们代表什么?
这种做法来自 C。由于 C 不支持异常,因此程序员经常使用 return 值作为 status 来指示函数是否成功。有些程序使用 error
或 status
参数,并将它们适当地设置为错误或状态代码。
在 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_condition
、std::optional
或 std::expected
。后者是对前两个使用 C++23 的征服。