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