C++ 为什么C++;预处理器没有对枚举值正确执行算术运算?

C++ 为什么C++;预处理器没有对枚举值正确执行算术运算?,c++,visual-studio-2008,enums,c-preprocessor,C++,Visual Studio 2008,Enums,C Preprocessor,以下代码不生成#错误,而是编译、运行并输出跟踪值37(TT_LAST_PARM等于53,TT_FIRST_PARM等于16): 如果我硬编码这些值 #if ((53 - 16) >= 32) #error More than 32 parm tokens #else HTRACE("%d", 53 - 16); #endif 预处理器不会生成错误: 错误1致命错误C1189:#错误:超过32个parm令牌d:\codeMTX\Knowbase\KBMatL\PrintParser

以下代码不生成
#错误
,而是编译、运行并输出跟踪值37(TT_LAST_PARM等于53,TT_FIRST_PARM等于16):

如果我硬编码这些值

#if ((53 - 16) >= 32)
#error More than 32 parm tokens
#else
    HTRACE("%d", 53 - 16);
#endif
预处理器不会生成错误:


错误1致命错误C1189:#错误:超过32个parm令牌d:\codeMTX\Knowbase\KBMatL\PrintParser.CPP 2663

enum
是一个C/C++关键字,不是预处理器指令。
前置处理器指令由前导的
#
符号清楚地表示

预处理器不知道一个符号,称为“代码> TTHYLSTYPARM 等,并根据C++标准(16.1×4):

由于宏扩展和定义的一元运算符而进行的所有替换完成后,除true和false之外的所有剩余标识符和关键字都将替换为pp编号0


因此,表达式的计算结果为
(0-0)>=32

您不能使用预处理器执行此操作-您需要一个编译时断言;对于预处理器,它们只是未定义symbols@antlersoft这是有道理的,但我真的不喜欢使用#defines。为什么它不标记为预处理器错误,例如#if xyzy?我原以为我必须做#if defined(xyzy)&&xyzy???@PaulR我本来有断言,但我尝试在编译时标记可以(应该)的错误。@franji1:是的,这就是为什么我说你需要一个(即不是运行时断言)。我希望
#if(-)>=32
将生成一个预处理器错误:-\n如果您有C++11,您可以使用静态断言测试您的枚举。同意-但我目前在使用VS2008时卡住了。
#if ((53 - 16) >= 32)
#error More than 32 parm tokens
#else
    HTRACE("%d", 53 - 16);
#endif