我想执行以下操作,但编译器不喜欢它:
unsigned short foo = 1;
// do something with foo
#if sizeof(short) * CHAR_BIT > 16
foo &= 0xffff;
#endif
我知道这个表达式总是可以在编译时完全评估,但是它可能只是在预处理器执行后才进行评估?这在ANSI C中是可行的还是我只需要在运行时进行检查?
答案 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()函数在这里由编译器解释,而不是预处理器。)
这种方法的主要缺点是编译错误不是很明显。请务必写清楚的评论。