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

2024-01-17

如果我这样做:

#define F a
F/

It expands to a/ godbolt https://gcc.godbolt.org/z/reGxqz

如果我这样做:

#define F /
F/

It expands to / / with a space in between goodbolt https://gcc.godbolt.org/z/nYhzGn

But if I convert it to a string, and print it, it doesn't add any spaces goodbolt https://gcc.godbolt.org/z/bTnsnK:

#include <stdio.h>

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

#define F /


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

为什么中间有一个空格,但只是某些时候?其他情况是否可以添加更多空格?


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

F/是两个令牌,F and /。宏展开后,仍然需要是两个token,/ and /。但如果你把它们并排打印,就会变成//,这只是一个标记(一条评论)。所以中间需要有一个空间。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么宏扩展有时会加一个空格? 的相关文章

随机推荐