1. (#)字符串化操作符
1.1 作用
将宏定义中的传入参数转化为用一对双括号括起来的字符串,该过程称之为字符串化,其只能用于有传入参数的宏定义中。
1.2 example
1.2.1 example1
#include <stdio.h>
#define ChangeCharacter(str) printf("测试输出:\n%s\n",str)
int main()
{
ChangeCharacter("Test character");
return 0;
}
1.2.2 example2
#include <stdio.h>
#define ChangeCharacter(x) printf(#x" = %d\n",(x))
int main()
{
ChangeCharacter(6);
ChangeCharacter(6+6);
return 0;
}
2.(##)粘贴操作符
2.1 作用
合并宏定义中的两个标识符,使其成为一个独立的标识符。
2.2 example
#include <stdio.h>
#define ChangeCharacter(x) num##x
int main()
{
int num6 = 65;
int num = ChangeCharacter(6);
printf("%d", num);
return 0;
}
2.3 注意
如
#define ChangeCharacter(x) num ## x
等同于
#define ChangeCharacter(x) num##x
#include <stdio.h>
#define STRCPY(a, b) strcpy(a ## _p, #b)
int main()
{
char var1_p[20];
char var2_p[30];
strcpy(var1_p, "aaaa");
strcpy(var2_p, "bbbb");
STRCPY(var1, var2);
STRCPY(var2, var1);
printf("var1 = %s\n", var1_p);
printf("var2 = %s\n", var2_p);
//STRCPY(STRCPY(var1,var2),var2);
//这里是否会展开为: strcpy(strcpy(var1_p,"var2")_p,"var2“)?答案是否定的:
//展开结果将是: strcpy(STRCPY(var1,var2)_p,"var2")
//## 阻止了参数的宏展开!如果宏定义里没有用到 # 和 ##, 宏将会完全展开
// 把注释打开的话,会报错:implicit declaration of function 'STRCPY'
return 0;
}
3. (__VA_AGRRS__)可变参数宏
3.1 作用
__VA_ARGS__ 是一个可变参数宏,与省略号 ... 配合使用,用来替换省略号所代表的字符串。
3.2 example
#include <stdio.h>
#define ExampleOutut(...) printf(__VA_ARGS__)
int main()
{
int num6 = 65;
ExampleOutut("Number is %d\n", num6);
return 0;
}