为什么宏展开有时会加一个空格?
如果我这样做:
#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,/和/。但是如果你把它们并排打印出来,它就会变成//,这只是一个标记(注释)。所以中间需要有一个空间。
长话短说:是的,宏扩展可以添加空格,因为空格在宏操作的级别无关紧要。