我知道:
#define foo 4
#define str(s) #s
withstr(foo)写出:"foo",因为 stringify 是在文本扩展之前执行的,但是:
#define xstr(s) str(s)
#define str(s) #s
#define foo 4
xstr(foo)写出"4":。
为什么?该过程涉及哪些步骤?
我知道:
#define foo 4
#define str(s) #s
withstr(foo)写出:"foo",因为 stringify 是在文本扩展之前执行的,但是:
#define xstr(s) str(s)
#define str(s) #s
#define foo 4
xstr(foo)写出"4":。
为什么?该过程涉及哪些步骤?
str(foo):替换str(foo)为#foo,即"foo"xstr(foo):替换xstr(foo)为str(<foo-value>),即str(4)str(4):替换str(4)为#4,即"4"预处理器评估扩展宏变量的宏函数,直到它没有评估:
如果你定义
#define xstr(s) str(s) + 1
#define str(s) s + 1
在下面的代码中
#define foo 4
int main()
{
std::cout << str(foo) << '\n'
<< xstr(foo) << '\n' ;
}
它会评估为
str(foo)为<foo-value> + 1, 即4 + 1结果是 4 + 1
xstr(foo)为str(<foo-value>) + 1, 即str(4) + 1str(4)为<4-value> + 1, 即4 + 1结果是 4 + 1 + 1