关注我们
  • 公众号

  • 抖音号

  • 小程序

联系方式: 400-8162-938
栏目导航

C++在# 与 ## 运算符

来源:华未云

更新:2025-02-14 17:12:08|关注1

函数式宏中,如果替换列表 中一个标识符前有 # 运算符,那么该标识符在运行形参替换的基础上以引号包围,实际上创建一个字符串字面量。另外,预处理器为内嵌的字符串字面量(如果存在)外围的引号添加反斜杠以进行转义,并按需要双写字符串中的反斜杠。移除所有前导和尾随空白符,并将文本中间(除内嵌字符串字面量中间外)的任何空白符序列缩减成单个空格。此操作被称为“字符串化”,如果字符串化的结果不是合法的字符串字面量,那么行为未定义。

# 出现于 __VA_ARGS__ 之前时,展开后的 __VA_ARGS__ 整体被包在引号中:
#define showlist(...) puts(#__VA_ARGS__)showlist();            // 展开成 puts("")showlist(1, "x", int); // 展开成 puts("1, \"x\", int")



如果替换列表 中任何两个相继标识符之间有 ## 运算符,那么这两个标识符(首先未被宏展开)在运行形参替换的基础上将结果进行拼接。此操作被称为“拼接”或“记号粘贴”。只有一同组成合法记号的记号才可以粘贴:如组成更长标识符的标识符、组成数字的数字位,或组成 += 的运算符 + 和 =。不能通过粘贴 / 和 * 来创建注释,这是因为注释在考虑文本宏替换前就已经被移除了。如果连接的结果不是合法记号,那么行为未定义。

注意:一些编译器提供了一项扩展,允许 ## 在逗号后及 __VA_ARGS__ 前出现,此情况下 ## 在存在可变实参时不做任何事,但在不存在可变实参时移除逗号:这使得可以定义如 fprintf (stderr, format, ##__VA_ARGS__) 这样的宏。也可以通过标准方式使用 __VA_OPT__ 实现,例如 fprintf (stderr, format __VA_OPT__() __VA_ARGS__)

声明:以上是华未云整理的全部内容。本站资源来自及互联网公开收集,仅限学习交流使用,请遵循相关法律法规,如有侵权争议、不妥之处请联系本站删除处理!