首页 > 解决方案 > 对象宏扩展列表中的哈希标记 (#) 有什么作用?

问题描述

我一直在尝试理解 C++ 预处理器中宏扩展的描述,如 C++14 标准的早期草案中所述。(这是我可以免费获得的版本,我怀疑从那以后预处理器发生了很大变化。)

草案举了一个例子:

#define hash_hash # ## #

并显示这扩展为##。我已经验证 g++ 有这种行为。但是我在标准的实际规范文本中找不到对此的解释,它解释了 # 在函数宏中的参数名称之前将相应的参数字符串化(我理解得很好),但没有说明它在任何其他方面的含义语境。

看到这个我就更疑惑了

#define pound #

扩展为#,完全符合我最初的预期。

标签: c++

解决方案


该示例向您展示了如何“转义”宏中的两个哈希序列。它采用第一个和最后一个散列并使用中间的双散列将它们连接起来,当在另一个宏中使用时,它将双散列序列输出。没有其他方法可以在宏中间编写双散列而不连接相邻的标记并消失。

发生这种情况是因为 C++ 被设计为一次性编译,因此一旦# ## #序列被预处理器预处理为##,它就永远不会再次“预处理”。


推荐阅读