2

我试图知道如何//以及"可以将其传递给宏替换,如下所示:

#define STR(str) #str

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

4

3 回答 3

2

//除了嵌入在字符串或字符常量中作为//注释到行尾的开始标记之外,没有其他方法可以传递给宏调用。注释剥离在处理宏之前完成。

同样,没有办法将裸双引号传递给宏。双引号要​​么在字符常量内,要么标记字符串的开始。

/*与和类似',对推理进行适当的更改。

于 2012-06-26T15:31:30.270 回答
0

不,没有办法在你写的时候传递它们。翻译阶段 3 是“源文件被分解为预处理标记和包括注释在内的空白序列”。

这意味着 STR(hel//lo) 变成了 STR(hel (带有尾随空格而不是注释)。

“预处理标记的类别是标头名称、标识符、pp 编号、字符常量、stringl 文字、标点符号和在词法上不匹配其他预处理标记字符的单个非空白字符。如果 ' 或 " 字符匹配最后一个字符,行为未定义” ...这意味着 STR(hel"lo) 也不允许。

于 2012-06-26T15:32:52.173 回答
0

给定一个标识宏和一个求值的字符串化宏,

#define ID(X) X
#define STR_EVAL(X) STR(X)

你可以“逃避”一个斜线

STR_EVAL( ID(hel)ID(/)/lo )

至于单引号,对不起,你不走运。宏的参数必须是记号,并且明确禁止单引号作为记号。

于 2014-06-16T12:50:23.307 回答