我知道:
#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) + 1
str(4)
为<4-value> + 1
, 即4 + 1
结果是 4 + 1 + 1