我想这样做,但编译器不喜欢它:
unsigned short foo = 1; // do something with foo #if sizeof(short) * CHAR_BIT > 16 foo &= 0xffff; #endif
我知道这个表达式总是可以在编译时被完全求值,但是也许它只在预处理器完成后才被求值,这在ANSI C中是可能的吗,还是我只需要在运行时做检查就可以了?
9vw9lbht1#
你不能在预处理器表达式中使用sizeof。你可能想这样做:
sizeof
#include <limits.h> #if SHRT_MAX > 32767 /* do soemthing */ #endif
moiiocjp2#
如果您的目标是在数据类型大小错误时停止编译,则以下技术非常有用:
struct _check_type_sizes { int int_is_4_bytes[(sizeof(int) == 4) ? 1 : -1]; int short_is_2_bytes[(sizeof(short) == 2) ? 1 : -1]; };
(The sizeof()函数在这里由编译器解释,而不是预处理器。这种方法的主要缺点是编译器错误不是很明显。确保你写了一个非常清楚的注解。
2条答案
按热度按时间9vw9lbht1#
你不能在预处理器表达式中使用
sizeof
。你可能想这样做:moiiocjp2#
如果您的目标是在数据类型大小错误时停止编译,则以下技术非常有用:
(The sizeof()函数在这里由编译器解释,而不是预处理器。
这种方法的主要缺点是编译器错误不是很明显。确保你写了一个非常清楚的注解。