以下代码不生成#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:#error :超过32个parm令牌d:\codeMTX\Knowbase\KBMatL\PrintParser.CPP 2663
发布于 2016-06-03 16:21:29
enum是C/C++关键字,而不是预处理指令.
预处理指令显然是由一个领先的#符号表示的.
预处理器没有/不知道一个名为TT_LAST_PARM等的符号,并且根据C++标准(第16.1节):
在执行了宏展开和定义的一元运算符的所有替换之后,除true和false外,其余所有标识符和关键字都将替换为pp-数字0。
因此,表达式的计算结果为(0 - 0) >= 32
https://stackoverflow.com/questions/37619078
复制相似问题