stringize运算符的未指定评估顺序

时间:2013-12-30 05:57:04

标签: c++ c-preprocessor operator-precedence stringification

通常使用比二元运算符更高的优先级来解析一元运算符,并且当从左向右扫描时,将首先找到前缀运算符。那么为什么在串联(#)运算符方面没有指定stringize(##)运算符的求值顺序?评估顺序是否意味着与[cpp.stringize]§16.3.2的上下文中的优先级不同?

(预处理器没有副作用,所以从技术上讲它没有评估顺序。)

如何将文本“替换为单个字符串文字预处理标记,其中包含相应参数的预处理标记序列的拼写”与其他优先级相互作用,假设任何替代方法都会串联连接结果,而不是论证本身?

是否有任何实施措施有趣,或者评估文本的顺序是否可以安全删除并替换为“#运算符的优先级高于##运算符”?

此问题已交叉发布到std-discussion邮件列表,但请在此处回复。

注意:我计划起草一份正式提案来修改C ++规范的这一部分,所以请分享您的知识!潜在的动机是使预处理器更具确定性。

1 个答案:

答案 0 :(得分:1)

我希望看到另一个答案,但是在关注@ R的评论后,我倾向于认为标准意味着它所说的内容。由于没有副作用,评估顺序对预处理器没有影响,因此不应该指定。应指定###的优先级和关联性,但标准中将省略这些优先级和关联性。

每个术语关联性优先级评估顺序具有相互排斥的含义,标准应高于对它们的区分。

编辑:我正式proposed来解决这个问题。 (见5.1节)