c++ - 为什么宏展开有时会加空格?
问题描述
如果我这样做:
#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,/
和/
. 但是,如果您将它们彼此相邻打印,它就会变成//
,这只是一个标记(评论)。所以中间需要有一个空格。
长话短说:是的,宏扩展可以添加空格,因为空格在宏操作的级别上并不重要。
推荐阅读
- excel - 我的代码采用一个空白单元格并将其调整为“空”,将文本变为红色的最有效方法是什么?
- amazon-web-services - 我们可以计划无服务器 aws 而不是部署吗?
- c# - C# WPF 与 CefSharp 在 VirtualBox 中崩溃
- php - SQL 查询不显示每个子类别中的产品
- ios - 对于 Cordova 应用内购买,沙盒“确认购买”屏幕是否与商店相同?
- wordpress - “外部化” TimberSite 方法的正确方法是什么?
- list - Kotlin:以功能方式组合列表中的某些元素
- node.js - 使用 socket.io 和 node.js 请求“未授权”
- python - 需要查找两个系列之间的总和值的任何组合是否超过阈值
- git - 有没有办法可以锁定文件在 git master 分支上被修改?