首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么C++预处理程序没有对枚举值进行正确的算术处理?

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

Stack Overflow用户
提问于 2016-06-03 16:13:26
回答 1查看 84关注 0票数 2

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

代码语言:javascript
复制
#if ((TT_LAST_PARM - TT_FIRST_PARM) >= 32)
#error More than 32 parm tokens
#else
HTRACE("%d", TT_LAST_PARM - TT_FIRST_PARM);
#endif

如果我硬编码这些值,

代码语言:javascript
复制
#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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-03 16:21:29

enum是C/C++关键字,而不是预处理指令.

预处理指令显然是由一个领先的#符号表示的.

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

在执行了宏展开和定义的一元运算符的所有替换之后,除true和false外,其余所有标识符和关键字都将替换为pp-数字0。

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37619078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档