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

fra*_*ji1 2 c++ enums visual-studio-2008 c-preprocessor

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

#if ((TT_LAST_PARM - TT_FIRST_PARM) >= 32)
#error More than 32 parm tokens
#else
HTRACE("%d", TT_LAST_PARM - TT_FIRST_PARM);
#endif
Run Code Online (Sandbox Code Playgroud)

如果我硬编码值,

#if ((53 - 16) >= 32)
#error More than 32 parm tokens
#else
    HTRACE("%d", 53 - 16);
#endif
Run Code Online (Sandbox Code Playgroud)

预处理器DOES生成错误:

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

kfs*_*one 7

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

预处理器没有/知道一个名为TT_LAST_PARMetc 的符号,并且根据C++标准(§16.14):

在由于宏扩展和已定义的一元运算符执行的所有替换之后,除了true和false之外的所有剩余标识符和关键字都被替换为pp-number 0

所以你的表达式评估为 (0 - 0) >= 32