c++ - 对象宏扩展列表中的哈希标记 (#) 有什么作用?
问题描述
我一直在尝试理解 C++ 预处理器中宏扩展的描述,如 C++14 标准的早期草案中所述。(这是我可以免费获得的版本,我怀疑从那以后预处理器发生了很大变化。)
草案举了一个例子:
#define hash_hash # ## #
并显示这扩展为##。我已经验证 g++ 有这种行为。但是我在标准的实际规范文本中找不到对此的解释,它解释了 # 在函数宏中的参数名称之前将相应的参数字符串化(我理解得很好),但没有说明它在任何其他方面的含义语境。
看到这个我就更疑惑了
#define pound #
扩展为#,完全符合我最初的预期。
解决方案
该示例向您展示了如何“转义”宏中的两个哈希序列。它采用第一个和最后一个散列并使用中间的双散列将它们连接起来,当在另一个宏中使用时,它将双散列序列输出。没有其他方法可以在宏中间编写双散列而不连接相邻的标记并消失。
发生这种情况是因为 C++ 被设计为一次性编译,因此一旦# ## #
序列被预处理器预处理为##
,它就永远不会再次“预处理”。
推荐阅读
- dart - Dart Hive TypeAdapter 对 write() 方法的合理性
- github-pages - 您如何将 MathJax 整合到 GitHub Pages 站点中?
- css - Flexbox 没有垂直居中
- javascript - 这种类型的字符串叫什么?
- javascript - nuxtjs:如何强制页面重新加载并调用 asyncData()?
- r - 从 xlsb 文件中读取工作表名称
- azure-ad-b2c - 如何在 azure b2c 上设置自定义 IdP 的登录按钮
- query-string - Kentico:未找到长查询字符串加载页面
- reactjs - 如何从调色板材质ui中获取颜色
- python - Discord.py 从客户端切换到机器人