C++ C预处理器字符串化中的额外间接性 #定义N 1 #定义A(N)#N #定义S_A(N) #定义B_N(N)#N #定义B(N)B_N(N) #定义S_B B(N) #包括 内部主(空){ 看跌期权(S_A); 看跌期权(S_B); }

C++ C预处理器字符串化中的额外间接性 #定义N 1 #定义A(N)#N #定义S_A(N) #定义B_N(N)#N #定义B(N)B_N(N) #定义S_B B(N) #包括 内部主(空){ 看跌期权(S_A); 看跌期权(S_B); },c++,c,c-preprocessor,C++,C,C Preprocessor,输出N和1,而不是两个1s 为什么额外的间接操作会产生不同?它的工作原理不同,因为N的宏扩展只发生在N的“使用”上。因此sua扩展到A(N),扩展到\N。在sub中,它被扩展到B(N),然后被扩展到\u B(1),然后是\1。为什么?那么,你会怎么做呢 #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&g

输出
N
1
,而不是两个
1
s


为什么额外的间接操作会产生不同?

它的工作原理不同,因为
N
的宏扩展只发生在
N
的“使用”上。因此
sua
扩展到
A(N)
,扩展到
\N
。在
sub
中,它被扩展到
B(N)
,然后被扩展到
\u B(1)
,然后是
\1
。为什么?那么,你会怎么做呢

#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);
}

从而生成
intfoobar=34,而不是非法的
int12=34

它的工作原理不同,因为
N
的宏扩展只发生在
N
的“使用”上。因此
sua
扩展到
A(N)
,扩展到
\N
。在
sub
中,它被扩展到
B(N)
,然后被扩展到
\u B(1)
,然后是
\1
。为什么?那么,你会怎么做呢

#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);
}

从而生成
intfoobar=34,而不是非法的
int12=34

它的工作原理不同,因为
N
的宏扩展只发生在
N
的“使用”上。因此
sua
扩展到
A(N)
,扩展到
\N
。在
sub
中,它被扩展到
B(N)
,然后被扩展到
\u B(1)
,然后是
\1
。为什么?那么,你会怎么做呢

#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);
}

从而生成
intfoobar=34,而不是非法的
int12=34

它的工作原理不同,因为
N
的宏扩展只发生在
N
的“使用”上。因此
sua
扩展到
A(N)
,扩展到
\N
。在
sub
中,它被扩展到
B(N)
,然后被扩展到
\u B(1)
,然后是
\1
。为什么?那么,你会怎么做呢

#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);
}

从而生成
intfoobar=34,而不是非法的
int12=34

您是否打算使用
##运算符
粘贴令牌

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

在不太影响宏的情况下,如果要同时打印
1,1
,可以通过以下方式使用宏:

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

您是否打算使用
##运算符
粘贴令牌

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

在不太影响宏的情况下,如果要同时打印
1,1
,可以通过以下方式使用宏:

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

您是否打算使用
##运算符
粘贴令牌

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

在不太影响宏的情况下,如果要同时打印
1,1
,可以通过以下方式使用宏:

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

您是否打算使用
##运算符
粘贴令牌

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

在不太影响宏的情况下,如果要同时打印
1,1
,可以通过以下方式使用宏:

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