gpt4 book ai didi

C 检查标准库中的错误(ret < 0 vs ret == -1)

转载 作者:太空狗 更新时间:2023-10-29 16:43:49 26 4
gpt4 key购买 nike

我经常看到通过测试小于零而不是显式定义来检查 POSIX 函数错误的代码,通常唯一的错误代码使用 -1。也就是

ret = function();
if (ret < 0) {
...
}

对比

ret = function();
if (ret == -1) {
...
}

第一次练习有什么目的吗?在某些架构上与 0 进行比较是否比与 -1 进行比较更快?如果现在定义的唯一错误代码是 -1,C 或 POSIX 标准是否保证第一个替代方案将来不会中断?如果不是,是否应该将其视为不良做法? (我想大多数功能不太可能以导致大量已编写代码损坏的方式进行更改?)。

编辑:为了让问题更清楚:我只谈论专门返回 -1 作为标准定义的错误代码的函数。我知道有些人没有。我在很多地方看到了对这些函数的 < 0 检查,而不是 == -1。因此问题。

最佳答案

首先,有些函数只有一个错误代码,有些函数有多个。例如,pthread_create 是一个可以返回多个错误代码的 POSIX 函数。当我不关心具体的错误代码时,我也不想关心它们有多少。在这种情况下,检查负返回只是一种涵盖所有情况的可靠的通用免维护方法。此外,POSIX 规范中的错误通常根据 list 常量而不是具体数值来描述。

其次,我不确定 POSIX 对现有函数的错误返回的可扩展性到底说了什么,但我自然更愿意在我的代码中预见到这种可能性。

第三,一般来说,在许多(如果不是大多数或全部)处理器上检查“负”值比检查特定值更有效。许多 CPU 都有一个专用的 CPU 状态标志,用于指示负面结果。这意味着测试负值不必涉及文字操作数。例如,在 x86 平台上,否定性测试不必涉及与文字 0 的比较。与特定值的比较通常需要将该特定值嵌入到机器指令中,从而导致指令变慢。但是,在任何情况下,“特殊”值,如 0-11 等,都可以进行测试以使用更聪明和高效技巧。因此,出于性能原因,我怀疑所讨论的比较是以这种方式进行的。

关于C 检查标准库中的错误(ret < 0 vs ret == -1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21684292/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com