许多标准 C 和 POSIX 函数返回 -1 对于错误,以及 0 例如关于成功 truncate, fflush, msync, , ETC。

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

检查是否成功是更好的做法 ret != -1 或者 ret == 0, ,为什么?

我的想法

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

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

更新0

我的一个假设是人们意识到 EOF 通常定义为 -1.

有帮助吗?

解决方案

在我看来,这真的取决于你需要做什么和返回值的范围。

,要考虑与一个成功值和许多失败值的调用。它通常更容易==!=反对不是反对任何故障值校验成功返回值。在这种情况下,你将测试针对!= success如果你需要,比方说,记录和回报或在出现故障的情况下抛出。

在具有一个和一个呼叫时,所期望的行为更重要,所以我建议选择更具有可读性。如果你的代码需要作出反应,并可能在失败时返回,然后检查== failure而不是!= success。前者更可读的,因为它需要思考的一个步骤和故障常数可以被有益地命名。

您也可能要考虑这是更容易和句柄第一,或在数值更大或更小。

在你的情况下,具有两种功能共享一个成功码和具有不同失败代码,它属于哪个看上去更具有可读性。我会同意,在两种情况下测试的== 0会看起来更好,但它确实取决于有多少代码的调用之间来。如果你有几十行,可能不会有太大的可读性的差别。如果这是非常密切的,你甚至可以或者结果一起,为自己节省一些步骤。

其他提示

这取决于该功能是否是一个C标准库函数或POSIX功能。 C函数不具有用于返回代码的统一的标准所以我使用任何测试使上的情况下,逐案最有意义。

POSIX,在另一方面,是更一致的。几乎所有的POSIX函数定义返回-1,在errno提供更具体的错误代码。有些功能只是返回0成功,而另一些成功的值,众说纷纭。例如,open()返回文件描述符,read()返回的字节数读等

有关一致性我喜欢调用POSIX函数时总是使用相同的试验:不失败的成功测试中,测试。 POSIX的功能,今天返回-1错误时总是恰好返回-1,所以我会用两个检查中的一个为所有这些:

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

// or

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

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

比较为truncatefflush手册页上成功都返回0,但用于错误返回不同的值(截断 - > -1,fflush - 将> EOF)。所以我检查0。

证书指南 似乎更喜欢“!= 0”检查,因为在许多示例代码片段中都是有效的。

请务必检查手册页返回代码。

一般0表示成功,但例外存在诸如printf()

检查man 2 intro系统调用的errnos和错误代码。

不管你做什么,从来没有快捷方式,成功以

测试
if (!ret) 

它的混乱和某人(包括自己)的后来看错了,作为一个失败的试验。这是一般最好使用明确的测试。

如果定义是,0表示成功,并且要检查的成功则应检查等价为0(这是没有其他原因比剪切可读性)

有关最POSIX API函数,负的值是错误。所以我测试与if (ret < 0)故障。

我的经验法则是想通过返回值这些返回错误代码(或只是是否发生了错误),该功能。所以,对我来说是非常有意义的,有没有那种0表示返回值返回,并没有出现错误。因此,我只是检查,如果返回值是0,如果我想要测试功能是否成功,如果不只是检查一下错误值相应地是和对付它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top