# 会将参数加个双引号
## 会将两个参数拼接在一起
#define toStr(a) #a
#define con(a, b) a##b
int main(){
toStr(1);
con(1, 2);
return 0;
}
使用 gcc -E 预处理 .c 文件可得
int main(){
"1";
11;
return 0;
}
一个坑
宏参数是另外一个宏时,有 # 和 ## 的参数不会展开
#define toStr(a) #a
#define con(a,b) a##b
#define A 1
int main(){
toStr(A); // 不是预期的 "1"
con(A, A); // 不是预期的 11
return 0;
}
使用 gcc -E 预处理 .c 文件可得
int main(){
"A";
AA;
return 0;
}
解决方案
通过外部的宏包装,在外部将参数宏展开后再传入原来的宏
#define toStr(a) #a
#define con(a,b) a##b
#define wrapToStr(a) toStr(a)
#define wrapCon(a,b) con(a,b)
#define A 1
int main(){
wrapToStr(A); // wrapToStr(A) -> wrapToStr(1) -> toStr(1) -> "1"
wrapCon(A, A); // wrapCon(A,A) -> wrapCon(1,1) -> con(1,1) -> 11
return 0;
}
使用 gcc -E 预处理 .c 文件可得
int main(){
"1";
11;
return 0;
}



