在用constexpr auto替换宏时,我遇到了以下宏
#define MSG_SELECTED_INSPECTION [OF D] 490
这一直存在于项目中,并且可以正常编译。
但是要删除空间
#define MSG_SELECTED_INSPECTION[OF D] 490
出现错误'[':unexpected macro definition
第一行为什么没有错误发出?
答案 0 :(得分:3)
宏主要是文本替换工具。 #define MSG_SELECTED_INSPECTION [OF D] 490
是一个完全有效的宏定义。每当看到MSG_SELECTED_INSPECTION
时,它将被[OF D] 490
替换。
#define MSG_SELECTED_INSPECTION[OF D] 490
的原因是因为定义必须与宏名称至少用空格隔开。这是因为并非所有编译器都允许标识符中使用相同的字符集,如果
#define A$B C
将在一个实现中将宏A
定义为扩展为$B C
,在另一个实现中将宏A$B
定义为扩展为C
。
答案 1 :(得分:2)
宏是文本替换。
因此,您之前将MSG_SELECTED_INSPECTION
替换为[OF D] 490
。
看来您以前没有使用过MSG_SELECTED_INSPECTION
。
答案 2 :(得分:2)
第一行为什么没有错误发出?
宏有两种形式,函数式和对象式(您所拥有的)。
if(GetKeyDown(KeyCode.A) || GetKeyDown(KeyCode.LeftArrow)){
gun.transform.position = player.position.rotate; // ???
}
A space is required作为宏和定义为其替换的标记序列之间的分隔符。删除空格后,它不再是有效的(类似于对象的)宏定义。