时间:2011-07-26 09:59:44

标签: c c-preprocessor sizeof ansi

我想执行以下操作,但编译器不喜欢它:

unsigned short foo = 1;
// do something with foo
#if sizeof(short) * CHAR_BIT > 16
   foo &= 0xffff;
#endif

我知道这个表达式总是可以在编译时完全评估,但是它可能只是在预处理器执行后才进行评估?这在ANSI C中是可行的还是我只需要在运行时进行检查?

2 个答案:

答案 0 :(得分:5)

您不能在预处理程序表达式中使用sizeof。你可能想做这样的事情:

#include <limits.h>

#if SHRT_MAX > 32767
    /* do soemthing */
#endif

答案 1 :(得分:5)

如果您的目标是在数据类型错误时停止编译,则以下技术很有用:

struct _check_type_sizes
{
  int int_is_4_bytes[(sizeof(int) == 4) ? 1 : -1];
  int short_is_2_bytes[(sizeof(short) == 2) ? 1 : -1];
};

(sizeof()函数在这里由编译器解释,而不是预处理器。)

这种方法的主要缺点是编译错误不是很明显。请务必写清楚的评论。