我可以从函数返回 EXIT_(FAILURE|SUCCESS) 吗?

时间:2021-07-09 09:28:26

标签: c function

假设我定义了一个函数返回一个 int 表示成功标志,

// returns an int representing a successfulness
int not_main_add_element_at_index_of_the_list(list *l, size_t i, void *d) {
    // fail when i > l.size
    // fail when failed to allocate a node
    // ...
    // anyway two possible values for the result: success, failure
}

当我打算时,结果应该只有两种,成功和失败,不管是什么原因, 我可以返回 EXIT_FAILUREEXIT_SUCCESS 吗?

还是我应该坚持bool

4 个答案:

答案 0 :(得分:3)

可以但你不应该。这些是为程序的退出代码保留的,只能与 exit 系列函数一起使用或在 return from main 期间使用。

专业 API 通常也不会返回 bool 进行错误处理,因为这非常直率并且除了 ok 或 failure 之外不提供任何信息。 (正如我们从 SO 了解到的,“它不起作用”是一个非常糟糕的错误描述。)

当涉及到正确的 API 设计时,一般的好做法是返回一个自定义 typedef:ed enum,其中包含特定于您的模块/库的错误代码。在您的情况下,我希望看到如下内容:

list_err_t add_item (/* ... */);

答案 1 :(得分:2)

这是一个主观问题。通过包含 stdlib.h,没有什么可以阻止您使用 EXIT_FAILUREEXIT_SUCCESS

你可以这样做。

正如您所提到的,您也可以使用 bool。我建议这样做,因为它使 if 表达式更容易编写 if (element_at_index_of_the_list(..))。您可以在 GitHub 的开源代码中找到它。

答案 2 :(得分:2)

从不是 EXIT_FAILURE 的函数返回 EXIT_SUCCESSmain 不是惯用的。这是可能的,但我肯定会避免它。部分原因是当您在代码中看到其中一个时,您会期望它退出程序。

但也因为如果你只有两个不同的返回值,那么你通常希望使用一个可以评估为真的返回值来表示成功,但是两个退出宏被翻转了。 EXIT_SUCCESS 定义为零。当然,有些库函数在成功时返回零,但我个人更喜欢 if(foo()) 应该在 foo 成功时运行 if 块。

在您的情况下,我也不会使用 bool。我会返回一个指向添加元素的指针,失败时返回 NULL

一般来说,我只会使用 bool 作为函数的返回类型,其中函数的名称以 is 开头是有意义的。例如isdigit()

我也倾向于考虑最有用的返回值是什么。通过返回指向添加元素的指针,您将获得该指针和检查失败的方法。那么为什么要选择 bool 呢?

如果您想编写一个函数来检查字符串是否包含字符,可以使用相同的推理。如果它包含字符,您可以返回 true,但您可以通过返回出现次数来使函数更有用。除非你当然需要优化代码。

答案 3 :(得分:1)

这取决于你想对结果做什么。我建议使用 stdbool.h 中的 bool,因为这是一种以这种方式测试函数成功或失败的常见模式,例如

if (my_function()) {
        //it worked
}

但如果由于某种原因您需要测试特定的错误代码,例如 EXIT_SUCCESS,您可以使用它,它只是 stdlib.h 中的一个宏。在这种特定情况下,这样做没有多大意义,因为这两个代码可以用 truefalse 表示,而且它们实际上是 intended for use with the exit() function。因此,如果您想在返回值中指示特定结果,最好定义您自己的错误代码。

另请注意,当命令没有返回错误时,EXIT_SUCCESS 对应于 0(即 false),这是您在 bash 中所期望的。

相关问题