1. (#)字符串化操作符
作用:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串。其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。
如:
#define example( instr ) printf( "the input string is:\t%s\n", #instr )
编译时:
example( abc ); // 在编译时将会展开成:printf("the input string is:\t%s\n","abc")
2. (##)符号连接操作符
作用:将宏定义的多个形参转换成一个实际参数名。
如:
#define exampleNum( n ) num##n
使用时:
nt num9 = 9;
int num = exampleNum( 9 ); // 将会扩展成 int num = num9
注意:
a. 当用##连接形参时,##前后的空格可有可无。
如:
#define exampleNum( n ) num ## n
// 相当于 #define exampleNum( n ) num##n
b. 连接后的实际参数名,必须为实际存在的参数名或是编译器已知的宏定义。
c. 如果##后的参数本身也是一个宏的话,##会阻止这个宏的展开。
#include <stdio.h>
#include <string.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;
}
结果:
var1 = var2
var2 = var1
1473

被折叠的 条评论
为什么被折叠?



