·#运算符用于预处理器期将宏参数转换为字符串
·#的转换做用是在预处理器完成的,所以只在宏定义中有效
·编译器不知道#的转换做用
·用法:code
printf("%sn",STRING(HELLO World!)); 字符串
例子25-1:编译器
int main()
{io
printf("%s\n",STRING(Hello world!)); printf("%s\n",STRING(100)); printf("%s\n",STRING(While)); printf("%s\n",STRING(return)); return 0;
}
输出结果:
Hello world!
100
While
return编译
例子25-2:function
int square(int n)
{di
return n * n;
}
int func(int x)
{co
return x;
}
int main()
{字符
int result = 0; result = CALL(square, 4); //result = (printf("Call funtion %s\n","square"),square(4)); printf("result = %d\n",result); result = CALL(square, 10); printf("result = %d\n",result);
}
输出结果:
Call function square
result = 16
Call function square
result = 100运算符
·##运算符用于预处理器粘连两我的标识符
·##的链接做用是在预处理器期完成的,所以只在宏定义中有效
·编译器不知道##的链接做用
·用法
int CONNECT(a,1); //int a1;
a1 = 2;
例子25-3:
int main()
{
int NAME(1); int NAME(2); NAME(1) = 1; //name1 = 1; NAME(2) = 2; //name2 = 2; printf("%d\n",NAME(1)); printf("%d\n",NAME(2));
}
输出结果:
1
2
例子25-4:
STRUCT (Student)
{
char *name; int id;
}
int main()
{
Student s1; Student s2; s1.id = 0; s1.name = "S1"; s2.id = 1; s2.name = "S2"; printf("s1.name = %s\n",s1.name); printf("s1.id = %d\n",s1.id); printf("s1.name = %s\n",s1.name); printf("s1.id = %d\n",s1.id); return 0;
}
小结:
编译器不知道#和##运算符的存在