我正在阅读使用固定宽度整数使代码更具可移植性。我发现this文章有助于解释事情,最后它建议使用这个匿名联合来检测和报告typedef错误:
static union
{
char int8_t_incorrect[sizeof( int8_t) == 1];
char uint8_t_incorrect[sizeof( uint8_t) == 1];
char int16_t_incorrect[sizeof( int16_t) == 2];
char uint16_t_incorrect[sizeof(uint16_t) == 2];
char int32_t_incorrect[sizeof( int32_t) == 4];
char uint32_t_incorrect[sizeof(uint32_t) == 4];
};
我有点失落,我希望有人可以解释这是做什么的?
答案 0 :(得分:4)
如果这些相等性检查中的任何一个导致false,那么union将有一个数组大小为0的字段,这是不允许的,并且会导致编译器错误。
答案 1 :(得分:4)
它正在滥用编译器,这就是它正在做的事情。
基本上sizeof(type) == num
正在编译时进行评估,它将生成0
或1
(false或true)。如果它为0(它们都不应该是),则会产生编译器错误,因为您无法声明大小为零的数组。
但是如上所述,这对编译器来说非常滥用,大多数理智的构建环境都会确保typedef对你来说是正确的(例如autoconf有这种东西的内置宏)。