检测并报告typedef错误......这是做什么的?

时间:2011-08-11 00:34:18

标签: c++

我正在阅读使用固定宽度整数使代码更具可移植性。我发现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];
};

我有点失落,我希望有人可以解释这是做什么的?

2 个答案:

答案 0 :(得分:4)

如果这些相等性检查中的任何一个导致false,那么union将有一个数组大小为0的字段,这是不允许的,并且会导致编译器错误。

答案 1 :(得分:4)

它正在滥用编译器,这就是它正在做的事情。

基本上sizeof(type) == num正在编译时进行评估,它将生成01(false或true)。如果它为0(它们都不应该是),则会产生编译器错误,因为您无法声明大小为零的数组。

但是如上所述,这对编译器来说非常滥用,大多数理智的构建环境都会确保typedef对你来说是正确的(例如autoconf有这种东西的内置宏)。