【问题标题】:Stringification macro always adds a single space character字符串化宏总是添加一个空格字符
【发布时间】:2016-09-21 13:42:02
【问题描述】:

给定以下代码,它打印一个字符串,该字符串是两个单词的字符串化:

#define PORT_INFO_MAC_2(portNum)   port:     portNum

#define PORT_INFO_MAC(portNum) PORT_INFO_MAC_2(portNum)

/* Stringify macro expansion instead of the macro itself */
#define INVOKE_MACRO(...) #__VA_ARGS__

printf(" %s " , INVOKE_MACRO(PORT_INFO_MAC(1)) ); /* In a more general way, I'll be using it like follows: INVOKE_MACRO(PORT_INFO_MAC(2), PORT_INFO_MAC(1), ...) */

输出始终为" port: 1 ""port""1" 之间有一个空格。为什么那里总是有一个空格,有没有办法控制空格的数量?

portportNum 之间更改PORT_INFO_MAC_2 宏中的空格数量不会改变输出空间数量。

编辑
似乎有两种情况,在第一种情况下,portportNum 最接近-PORT_INFO_MAC_2(portNum) port:portNum,然后它们之间的输出中不存在空格。在第二种情况下,它们之间的宏中存在任意数量的空格,输出中的空格数量始终为 1。 对此有什么正式的解释吗?有什么控制权吗?

【问题讨论】:

  • 注意:“空格键”是键盘上的大按钮,可生成空格字符。

标签: c gcc macros stringification


【解决方案1】:

为什么总是有一个空格,有没有办法控制空格的数量?

因为那是字符串化操作符被指定做的事情:

如果在替换列表中,一个参数前面紧跟一个# 预处理标记,则两者都被一个字符串文字预处理标记替换,该预处理标记包含对应参数的预处理标记序列的拼写。 参数的预处理标记之间每次出现的空格都会成为字符串文字中的单个空格字符。

(C2011 6.10.3.2/2;已添加重点)

当然,如果预处理标记之间根本没有空格,则字符串化中不会出现任何空格。

【讨论】:

  • 正确。能否提供源文档的链接?
  • @user2162550,我一般指的是a PDF version of the N1570 draft。我的答案包含部分和段落编号。您可以通过谷歌搜索“n1570”找到其他版本,包括 HTML 再现。最终的标准文档不是免费提供的,但它与 N1570 仅有细微差别。
猜你喜欢
  • 1970-01-01
  • 2014-04-17
  • 2017-04-18
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 1970-01-01
  • 2023-02-01
相关资源
最近更新 更多