给出以下代码打印字符串,该字符串是两个单词的字符串化:
#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。
对此有正式的解释吗?有没有控制权?
答案 0 :(得分:2)
为什么总有一个空间,有没有办法控制空间数量?
因为指定了字符串化运算符的作用:
如果在替换列表中,参数前面紧跟着
#
预处理标记,则它们都被单个字符串文字预处理标记替换,该标记包含相应参数的预处理标记序列的拼写。 参数的预处理标记之间每次出现的空格都会成为字符串文字中的单个空格字符。
(C2011 6.10.3.2/2;强调增加)
当然,如果预处理标记之间根本没有空格,则字符串化中不会出现任何空格。