使用errno进行应用程序/库错误报告

时间:2012-05-14 20:45:54

标签: c errno

我正在为一个软件项目编写一个C库。我需要做一些错误报告,但是我有点懒得实现我自己的一组复杂的错误代码,变量和函数。使用libc提供的errno工具进行自定义错误报告是否可以接受?我的所有错误都适合E...宏给出的类别。

例如,假设我的代码包含一个以十六进制表示法读取SHA256哈希并将其转换为某种内部格式的函数。我想使用errno报告错误:

#include <errno.h>

int hash_fromstr(hash_t *out, const char *in) {
  /* ... */

  if (strlen(in) != 65) {
    errno = EINVAL;
    return -1;
  }

  /* ... */
}

当然这个例子被荒谬简化,实际上在其他功能中可能会发生更多错误。

3 个答案:

答案 0 :(得分:4)

您可以根据需要修改errno的值,只需确保库代码在执行此操作之前检查未设置errno,以确保库代码仍能正确检测导致errno设置的内部标准故障。您也可以查看"should I set errno"以获取更多信息。

答案 1 :(得分:1)

很多人会认为这种无味。首先,模式是创建自己的变量,具有一系列针对您的问题调整的特定值。其次,存在线程安全问题,这是通过欺骗为errno处理的。

您确定不想为每个功能添加额外的int*来接收状态值吗?

答案 2 :(得分:0)

是的,您可以修改它并且它具有线程范围,这在这种错误处理中是非常理想的。

使用errno错误族(E...)并且可能扩展它可能是一个非常强大而简单的错误处理模式。其他人可能认为这种方法很糟糕,但恕我直言,它会产生更清晰的代码和错误处理的标准化模式。