C预处理器字符串化中的额外间接使得差异化

时间:2015-09-25 08:02:33

标签: c++ c c-preprocessor

#define N 1

#define A(N) #N
#define S_A A(N)

#define B_(N) #N
#define B(N) B_(N)
#define S_B B(N)

#include <stdio.h>

int main(void) {
  puts(S_A);
  puts(S_B);
}

输出N1,而不是两个1

为什么额外的间接会产生影响?

2 个答案:

答案 0 :(得分:3)

它的工作方式不同,因为N的宏扩展只发生在N的“使用”上。所以S_A exands到A(N),后者扩展为#N。在S_B中,它会展开为B(N),展开为_B(1),然后展开为#1。为什么?那么,你会怎样做:

 #define COMBINE(A, B)  A##B
 #define foo 1
 #define bar 2
 int COMBINE(foo, bar) = 34;

这样它就会生成int foobar = 34;,而不是非法的int 12 = 34;

答案 1 :(得分:0)

您是否打算使用## operator进行令牌粘贴?

puts(S_A);  //Gets expanded into puts(A(N)) --> puts(#N)

puts(S_B);  //Gets expanded into puts(B(N)) --> puts(_B(1)) --> puts(#1)

在不影响宏的情况下,如果您打算同时打印1,1,可以这样使用宏:

#define N "1"     //instead of 1
#define A(N) N    //instead of #N
#define B_(N) N   //instead of #N