ANSI C中表达式的条件编译和编译时评估

Rob*_*nes 1 c ansi sizeof c-preprocessor

我想做以下,但编译器不喜欢它:

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

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

Pau*_*l R 5

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

#include <limits.h>

#if SHRT_MAX > 32767
    /* do soemthing */
#endif
Run Code Online (Sandbox Code Playgroud)


Ian*_*dby 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];
};
Run Code Online (Sandbox Code Playgroud)

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

这种方法的主要缺点是编译错误不是很明显.确保你写了一个非常明确的评论.