如何将//或“传递给宏替换

时间:2012-06-26 15:21:00

标签: macros c-preprocessor

我试图了解如何将//"传递给宏替换,如下所示:

#define STR(str) #str

在调用STR(hel"lo)STR(hel//lo)时。 这给出了错误。有没有办法将这些传递给宏?

3 个答案:

答案 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 )

至于单引号,对不起,你运气不好。宏的参数必须是标记,并且特别禁止单引号作为标记。