c++ - 标准 C 函数 : Check for -1 or 0?

标签 c++ c return-value conventions correctness

许多标准的 C 和 POSIX 函数在错误时返回 -1,在成功时返回 0,例如 truncate , fflush , msync

int ret = truncate("/some/file", 42);

使用 ret != -1ret == 0 检查是否成功更好,为什么?

我的想法

根据我的经验,大多数人会检查错误情况 (ret != -1),因为通常只有一个(考虑返回 NULL 的函数>EOF 错误)。然而事后看来,这些函数可以从直接返回 errno 中获益(其中 0 被认为没有错误)。

还有一个担心是函数返回的不是0-1,或者稍后添加了额外的返回值。在这些情况下,测试指示成功的“最严格”值范围是有意义的 (ret == 0)。

更新0

我的假设是人们知道 EOF 通常被定义为 -1

最佳答案

这取决于函数是C标准库函数还是POSIX函数。 C 函数没有返回码的统一标准,因此我会根据具体情况使用最有意义的测试。

另一方面,POSIX 更加一致。几乎所有 POSIX 函数都定义为返回 -1,并在 errno 中提供更具体的错误代码。有些函数只返回 0 表示成功,而其他函数则有大量的成功值。例如,open()返回文件描述符,read()返回读取的字节数等。

为了保持一致性,我喜欢在调用 POSIX 函数时始终使用相同的测试:不要测试成功,测试失败。今天在出错时返回 -1 的 POSIX 函数将始终恰好返回 -1,因此我将对所有函数使用两种检查之一:

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

// or

if (ret < 0) {
    perror(...);
}

(我更喜欢第一个,但第二个更通用的不会打扰我。)

关于c++ - 标准 C 函数 : Check for -1 or 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3836573/

相关文章:

c++ - 将 c 字符串的地址转储到 ostream?

c - 如何删除二维字符数组指针的一项

java - 如何将值从一种方法返回到另一种方法并交换

C - 将返回变量设置为 const

return-value - 使用 phing/phingcall 内部调用目标时的返回值

c++ - 解码图像文件的框架

c++ - 无法将函数定义与模板化类中的现有定义相匹配

c++ - 在应该返回 vector 的函数中返回 NULL

c++ - 在 Intel CPU 上选择 32 位和 64 位内部 CRC

c - "\__signed" "\__signed__"和 "signed"有什么区别?