我正在为一个软件项目编写一个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;
}
/* ... */
}
当然这个例子被荒谬简化,实际上在其他功能中可能会发生更多错误。
答案 0 :(得分:4)
您可以根据需要修改errno的值,只需确保库代码在执行此操作之前检查未设置errno,以确保库代码仍能正确检测导致errno设置的内部标准故障。您也可以查看"should I set errno"以获取更多信息。
答案 1 :(得分:1)
很多人会认为这种无味。首先,模式是创建自己的变量,具有一系列针对您的问题调整的特定值。其次,存在线程安全问题,这是通过欺骗为errno处理的。
您确定不想为每个功能添加额外的int*
来接收状态值吗?
答案 2 :(得分:0)
是的,您可以修改它并且它具有线程范围,这在这种错误处理中是非常理想的。
使用errno错误族(E...
)并且可能扩展它可能是一个非常强大而简单的错误处理模式。其他人可能认为这种方法很糟糕,但恕我直言,它会产生更清晰的代码和错误处理的标准化模式。