许多标准的 C 和 POSIX 函数在错误时返回 -1
,在成功时返回 0
,例如 truncate
, fflush
, msync
等
int ret = truncate("/some/file", 42);
使用 ret != -1
或 ret == 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/