【发布时间】:2014-01-17 00:29:48
【问题描述】:
一元运算符的解析优先级通常高于二元运算符,当从左到右扫描时,首先会找到前缀运算符。那么为什么 stringize (#) 运算符的求值顺序未针对连接 (##) 运算符指定呢?在 [cpp.stringize] §16.3.2 的上下文中,评估顺序是否意味着与优先级不同的东西?
(预处理器没有副作用,所以从技术上讲,它没有评估顺序之类的东西。)
考虑到任何替代方案都会将连接的结果字符串化,而不是论据本身?
是否有任何实现做一些有趣的事情,或者评估文本的顺序是否可以安全地删除并替换为“# 运算符的优先级高于## 运算符”?
此问题已交叉发布到标准讨论邮件列表,但请在此处回复。
注意:我计划起草一份正式的提案来修改这部分 C++ 规范,所以请分享你的知识!潜在的动机是使预处理器更具确定性。
【问题讨论】:
-
首先,“优先级”和“求值顺序”是完全正交的概念……
-
@R.. 需要保留一粒盐,因为标准中使用的确切术语“评估顺序”在字面上下文中毫无意义。我欢迎任何关于规范这部分起源的启示,因为 AFAIK 没有历史预处理器曾经有副作用。
标签: c++ c-preprocessor operator-precedence stringification