以下代码不生成$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
答案 0 :(得分:7)
enum
是一个C / C ++关键字,而不是预处理器指令
预处理器指令由前导#
符号清楚地表示。
预处理器没有/知道一个名为TT_LAST_PARM
等的符号,并且根据C ++标准(§16.1¶4):
在由于宏扩展和已定义的一元运算符执行的所有替换之后,除了true和false之外的所有剩余标识符和关键字都将替换为pp-number 0
所以你的表达式评估为(0 - 0) >= 32