我想构建一个唯一的错误号,它由随机数和系统调用的errno
组成。例如:
#define ERRID(ERRNO) ((uint32_t)rand() << 16 | (uint32_t)(ERRNO) & 0xFFFF)
我需要知道存储errno
值需要多少位。
我知道它被定义为int
。但在64位系统上,错误总数远低于9,223,372,036,854,775,807。在我的Debian上,最大数量似乎是529。
dpkg -L linux-headers-3.16.0-4-common|
grep errno.h|
xargs cat|
awk '/^#define/{print $3}'|
sort -rn|
head -1
529
所以uint16_t
似乎足以存储errno
。
但如何确定?如何找出操作系统实际使用的errnos数量?是否记录在哪里?
答案 0 :(得分:3)
没有可移植的方法来做到这一点。 POSIX(和C)允许实现使用所有正int
值作为错误号,所使用的最大数量没有常量,并且可能没有大于int
的整数类型。
答案 1 :(得分:2)
您可以只传递一个包含两者 errno
错误代码和随机标识符的句柄(我假设您希望这是一个唯一ID,以便能够稍后识别特定的错误实例......?)
struct ErrorID {
int errno_error;
int rand_id;
}
ErrorID this_func_can_fail()
{
return (ErrorID){ .errno_error = errno, .rand_id = rand() };
}
编译:
#include <errno.h>
#include <stdlib.h>
struct ErrorID {
int errno_error;
int rand_id;
};
struct ErrorID this_func_can_fail()
{
return (struct ErrorID){ .errno_error = errno, .rand_id = rand() };
}
int main (int argc, char *argv[])
{
this_func_can_fail();
return 0;
}