4

目前,如果发生错误,我在 C 中的自定义函数中返回 -1,成功返回 0。例如,使用链表和某些函数需要一个非空列表才能正常工作。如果作为参数传递的列表为空,我返回 -1(错误),如果它不为空并且函数正常工作,则返回 0。

我是否应该返回 1 而不是 -1?

这是在 C 中做事的标准方式还是您推荐不同的方法?

4

4 回答 4

8

返回一个非零值表示失败。这样您就可以编写函数调用,如下所示:

if(func_call())
{
    doErrorHandling();
}

此约定将允许您使用任何!0值来指示特定错误,这将允许您以统一的方式使用一个变量。因此,if 上面示例中显示的主体可以有一个 switch 语句来处理特定的错误。

你可以用不同的方式来做——但如果你选择这样做,那么就坚持一个约定——不幸的是,win32 API(以及我使用过的其他 API)混合和匹配约定。

于 2010-02-07T15:30:16.613 回答
2

听起来不错。-1 用于 I/O 函数,因为正返回值通常表示成功,并且是已处理的字节数。如果您有多种方式可能导致函数出错,那么您可以返回不同的整数或设置全局错误变量(标准库使用 errno)来包含错误代码。

在风格方面,我不喜欢返回状态码,因为这意味着我的函数不能(干净地)返回任何其他内容。相反,我会在调用函数之前检查输入。但这是主观的,取决于上下文。

于 2010-02-07T15:33:33.410 回答
-1

我建议您找到一种方法来在错误点格式化一个信息丰富的人类可读字符串,在该错误点所有信息仍然可用,并设计一种方法通过程序的其余部分,通过用户,他的手机,交给你的开发团队进行分析。

如果您想更快地生产出更好的软件,这在我看来是任何设计的一个重要特征。中途杀死错误信息是大罪,C语言不是借口。

于 2010-02-07T15:56:37.897 回答
-5

有很多计划——但无论你做什么,都要坚持不懈!

如果您没有很多失败条件,只需使用 0 表示错误。这是因为错误测试以一种简单的方式编写:

if (!list_insert(...)) { handle_error; }

否则,低于零的答案可以与 >= 0 的正常答案一起使用。您可以将其用于列表长度等函数,在正常情况下不会为负数。或者,如果您想要许多错误代码(-1 - 不存在,-2 - 未找到,-3 ...,...)

于 2010-02-07T15:31:58.500 回答