为什么宏展开有时会加一个空格?

如果我这样做:

#define F a
F/

它扩展到 a/ godbolt

如果我这样做:

#define F /
F/

它扩展到/ /中间有一个空格goodbolt

但是,如果我将其转换为字符串并打印出来,它不会添加任何空格goodbolt

#include <stdio.h>

#define STR_IMPL(x) #x
#define STR(x) STR_IMPL(x)

#define F /


int main() {
  puts(STR(F/));
}

为什么中间有空格,但只有某些时候?在其他情况下是否允许添加更多空格?

回答

宏在令牌级别工作。以字符串形式打印结果时会添加空格以消除歧义。

F/是两个令牌,F并且/。宏展开后,还是需要两个token,//。但是如果你把它们并排打印出来,它就会变成//,这只是一个标记(注释)。所以中间需要有一个空间。

长话短说:是的,宏扩展可以添加空格,因为空格在宏操作的级别无关紧要。


以上是为什么宏展开有时会加一个空格?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>