【问题标题】:Is it OK to use EXIT_SUCCESS / EXIT_FAILURE for error reporting inside a program?可以在程序内部使用 EXIT_SUCCESS / EXIT_FAILURE 进行错误报告吗?
【发布时间】:2019-02-01 20:21:09
【问题描述】:

假设我有一个程序,其中我有一个类似于errno(名为project_error)的全局变量,其中存储了过去发生的确切错误,但我也希望函数返回一个简单的OK/ NOK 状态以简化错误处理,因此我仅在返回 NOK 时检查 project_error

是否可以使用<stdlib.h> 中定义的标准宏,或者我自己定义更好,因为这些通常意味着您实际上已退出程序?

这可能是基于意见的,但我想知道是否有任何事实上的标准或惯例。

以这种方式返回的错误可能是“输入超出范围”类型的无害错误,它只是拒绝用户输入并再次询问,或者是致命错误,需要调用者进行清理、发出警告并退出。这是通过读取全局变量而不是返回值来决定的。

【问题讨论】:

  • 没有“事实上的标准”,例如everyonedoesitdifferently。至于我自己,我通常只是return -__LINE__;,因为通常错误是无法恢复的。但是,请节省时间,不要使用单个全局静态变量。
  • 我使用全局变量,因为它是一个嵌入式系统,我可以轻松地将变量显示为长 LED 闪烁 (1) 和短 LED 闪烁 (0),这很容易向我显示发生的错误。我不会在桌面程序上这样做,如果需要,我会直接打印并退出
  • 投票结束作为 POB,但接受的答案是一个很好的建议。

标签: c error-handling


【解决方案1】:

正如您所说,EXIT_SUCCESS (0) 和 EXIT_FAILURE (1) 只是 stdlib 定义的宏,在 POSIX 系统上设置为这些整数,以便调用父进程只是对程序的退出状态有一个模糊的了解 (glibc reference) .我想说,由于这是供您自己内部使用的,如果您使用这些确切的值,只会让读者感到困惑。更好地定义您自己的名称,以使您使用这些错误的意图仅在内部清楚。

编辑:作为评论者正确地发现我写在上面括号中的实际整数值在 POSIX 系统上也是如此。

【讨论】:

  • EXIT_SUCESS 和 EXIT_FAILURE 来自 C11 标准,而不是 posix。而且,EXIT_SUCESS 和 EXIT_FAILURE 可能是 1 或 0,只是整数常量。哦,确实,在 posix 上,它们必须是 0 和 1,来自 here
  • 我认为定义早于 C11,它们应该从 C89 开始。而且我认为“这些整数”是指在 () 之间给出的那些整数值,他并不是暗示(据我所知)这些是定义在 POSIX 标准之外的整数值。
  • @JohnBollinger C11 说他们是 ICE。
  • 好吧,@AnttiHaapala。经过审查,我发现 C89 和 C99 说的是同一件事。 POSIX 措辞必须警告不符合标准的实现,然后,如果他们打扰了,那么我猜实际上可能已经存在在该领域不符合标准的实现。我已经删除了我之前的评论。
  • @KamilCuk 您引用的 GNU 文档是错误的。 POSIX 指定EXIT_FAILURE is non-zero
猜你喜欢
  • 2012-05-22
  • 2015-11-24
  • 2011-03-25
  • 2019-06-24
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 2018-02-28
  • 1970-01-01
相关资源
最近更新 更多