我试图了解如何将//
和"
传递给宏替换,如下所示:
#define STR(str) #str
在调用STR(hel"lo)
或STR(hel//lo)
时。
这给出了错误。有没有办法将这些传递给宏?
答案 0 :(得分:2)
除了嵌入在字符串或字符常量中之外,没有办法将//
传递给宏调用,因为//
标记了注释到行尾的开头。在处理宏之前完成注释剥离。
同样,没有办法将裸双引号传递给宏。双引号在字符常量内或标记字符串的开头。
同样适用于/*
和'
,并对推理进行了适当的更改。
答案 1 :(得分:0)
不,在你写的时候没办法传递它们。翻译阶段3是“源文件被分解为预处理标记和包含注释的空白序列”。
这意味着STR(hel // lo)变为STR(hel(带尾随空格而不是注释)。
“预处理标记的类别是标题名称,标识符,pp-number,字符常量,字符串文字,标点符号和单个非空格字符,它们与其他预处理标记字符没有词法匹配。如果是'或'字符匹配最后一个字符,行为未定义“...这意味着STR(hel”lo)也不允许。
答案 2 :(得分:0)
给定一个身份宏和一个评估stringize宏,
#define ID(X) X
#define STR_EVAL(X) STR(X)
你可以逃避"一个斜杠
STR_EVAL( ID(hel)ID(/)/lo )
至于单引号,对不起,你运气不好。宏的参数必须是标记,并且特别禁止单引号作为标记。