# 会将参数加个双引号
## 会将两个参数拼接在一起
#define toStr(a) #a #define con(a, b) a##b int main(){ toStr(1); con(1, 2); return 0; }
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; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)