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