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

时间:2016-06-03 16:13:27

标签: c++ visual-studio-2008 enums c-preprocessor

以下代码不生成$protocol = $_SERVER['HTTPS'] == '' ? 'http://' : 'https://'; $web_root = $protocol . $_SERVER['HTTP_HOST']; define('WEB_ROOT', $web_root); include (WEB_ROOT.'/file.php'); ,而是编译,运行并输出跟踪值37(TT_LAST_PARM等于53,TT_FIRST_PARM等于16):

#error

如果我对值进行硬编码,

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

预处理器DOES生成错误:

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

1 个答案:

答案 0 :(得分:7)

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

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

  

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

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