【发布时间】:2015-09-18 08:13:36
【问题描述】:
我想构建一个唯一的错误号,它由一个随机数和系统调用的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。
但是如何确定呢?如何找出操作系统实际使用了多少个 errno?它是否记录在任何地方?
【问题讨论】:
-
为什么如果
int16_t被定义为int,你必须使用它?!操作系统可以在下一个补丁中随意添加任何错误编号,在您发布应用程序两天后假设它适合 16 位有符号整数。 -
你能用
struct UniqueError { int randNumber, int errnoNumber };这样的结构吗?这就是我会考虑的,就可移植性而言,而不是依赖 errno 的“最大”值(可能会随着时间和系统之间的变化而变化) -
int在 64 位 Linux 上只有 32 位。 -
@AdrianoRepetti 请阅读我的问题的第一句话。
-
@Andreas 这就是我问的原因,如果它在标准中指定。