给定以下打印字符串的代码,该字符串是两个单词的字符串:
#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"之间只有一个空格。为什么总是有一个单独的空间,是否有方法来控制空间的数量?
在PORT_INFO_MAC_2宏中在port和portNum之间更改空格的数量并不会改变输出空间的大小。
编辑
似乎有两种情况,在第一种情况下,port和portNum是最近的-- PORT_INFO_MAC_2(portNum)   port:portNum,它们之间的输出没有空间。在第二种情况下,在它们之间的宏中存在任意数量的空格,输出中的空格数量总是1,对此有什么正式的解释吗?对此有什么控制吗?
发布于 2016-09-21 13:57:53
为什么总是有一个单独的空间,是否有方法来控制空间的数量?
因为这是指定字符串化运算符要做的事情:
如果替换列表中的参数紧接在
#预处理令牌之前,则这两个标记都被包含相应参数的预处理令牌序列的拼写的单个字符串文字预处理令牌替换。参数的预处理标记之间的每一个空格都成为字符串文本中的单个空格字符。
(C2011 6.10.3.2/2;重点添加)
当然,如果预处理标记之间根本没有空白,那么字符串化中就不会出现空白。
https://stackoverflow.com/questions/39618298
复制相似问题