首页 > 解决方案 > 为什么宏展开有时会加空格?

问题描述

如果我这样做:

#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/));
}

为什么两者之间有一个空间,但只有一些时间?是否允许在其他情况下添加更多空格?

标签: c++c-preprocessor

解决方案


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

F/是两个标记,F并且/. 宏展开后,还是需要两个token,//. 但是,如果您将它们彼此相邻打印,它就会变成//,这只是一个标记(评论)。所以中间需要有一个空格。

长话短说:是的,宏扩展可以添加空格,因为空格在宏操作的级别上并不重要。


推荐阅读