C 用宏可以转字符串与拼接字符。
举例
#include <stdio.h>
#define CON(a) (B##a) //concatenate
#define STR(a) #a
enum{B0,B1};
int pt(int b) {
printf("B%d\n",b);
}
int main()
{
printf("B" STR(0) " %d B1 %d\n",CON(0),CON(1));
pt(CON(0));
pt(CON(1));
}
输出
B0 0 B1 1
B0
B1
CON(0) B##0 拼接为B0
CON(1) B##1 拼接B1
STR(0) #0 转为 字符串0
如果用 #define STR(a) (#a ) 输出的是(“0”)
如
#include <stdio.h>
#define CON(a) (B##a) //concatenate
#define STR(a) #a
#define STRP(a) (#a);
enum{B0,B1};
int pt(int b) {
printf("B%d\n",b);
}
int main()
{
printf("B" STR(0) " %d B1 %d\n",CON(0),CON(1));
pt(CON(0));
pt(CON(1));
printf STRP(0);
printf("\n");
}
转为 printf(“0”);
输出为
B0 0 B1 1
B0
B1
0
因为是预处理 用处理后的源码 编译
如果
int pt(int b) {
printf("B%d\n",CON(b));
}
就会出错 因为预处理后就变成Bb了 。
运行中不会处理。