#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);
}
输出N
和1
,而不是两个1
。
为什么额外的间接会产生影响?
答案 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