ANSI C中表达式的条件编译和编译时求值

2ic8powd  于 2023-03-28  发布在  其他
关注(0)|答案(2)|浏览(104)

我想这样做,但编译器不喜欢它:

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

我知道这个表达式总是可以在编译时被完全求值,但是也许它只在预处理器完成后才被求值,这在ANSI C中是可能的吗,还是我只需要在运行时做检查就可以了?

9vw9lbht

9vw9lbht1#

你不能在预处理器表达式中使用sizeof。你可能想这样做:

#include <limits.h>

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

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()函数在这里由编译器解释,而不是预处理器。
这种方法的主要缺点是编译器错误不是很明显。确保你写了一个非常清楚的注解。

相关问题