56

我知道:

#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":。

为什么?该过程涉及哪些步骤?

4

2 回答 2

60
于 2013-06-07T18:25:43.103 回答
15

第一个案例

  1. 评估str(foo):替换str(foo)#foo,即"foo"

第二种情况

  1. 评估xstr(foo):替换xstr(foo)str(<foo-value>),即str(4)
  2. 评估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' ;

} 

它会评估为

第一个字符串

  1. 替换str(foo)<foo-value> + 1, 即4 + 1
  2. 没有什么可以替代的了。精加工。

结果是 4 + 1

第二串

  1. 替换xstr(foo)str(<foo-value>) + 1, 即str(4) + 1
  2. 替换str(4)<4-value> + 1, 即4 + 1
  3. 没有什么可以替代的了。

结果是 4 + 1 + 1

于 2013-06-07T17:30:54.590 回答