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

Why is the C++ preprocessor not doing arithmetic properly on enum values?

本文关键字:运算 枚举 预处理 C++ 处理器 为什么      更新时间:2023-10-16

以下代码不生成#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

如果我对值进行硬编码,

#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++关键字,而不是预处理器指令
预处理器指令由一个前导#符号清楚地表示。

预处理器没有/知道一个称为TT_LAST_PARM的符号等,根据C++标准(§16.1¶4):

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

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