#是取变量的意思,把参数拿来,并字符串化。
如:
#define PRINT1(NAME) printf("token"#NAME"\n")
{
NSString*ab1 =@"c爷爷";
PRINT1(ab1);
PRINT1(@"c爷爷");
}
这段代码输出什么呢?
ab1 和 @"c爷爷" 对于#NAME来说都一样,仅仅是字符串的替换。所以输出:
tokenab1
token@"c爷爷"
当我们把这个宏定义改为#define PRINT1(NAME) printf("token"NAME"\n")时,会有报错,说明不加#不能把变量字符串化。
image
也不能#(变量)
image
直接使用NAME时,预编译器是会做替换的,而且需要使用()。用法如下:
#define PRINT1(NAME) printf("token"#NAME" : %d", ((NAME) * (NAME)))
{
// char *token100 = "c爷爷万寿无疆";
PRINT1(100);
}
输出:
**token100 : 10000**
##是连接的意思,没有转换。##之后的元素需要有意义,否则报错。
#define connect(X,Y) X##Y
{
NSString*ab1 =@"c爷爷";
NSLog(@"%@",connect(ab, 1));
}
输出:
c爷爷
##两端也不能加括号(),因为)(都是有意义的。
#define connect(X,Y) (X)##(Y)
再执行上面的测试代码时
image
最后把#和##结合一下
#define PRINT(NAME) printf("token"#NAME"=%s\n", token##NAME)
{
char*token100 ="c爷爷万寿无疆";
PRINT(100);
}
输出什么呢?
**token100=c爷爷万寿无疆**
VA_ARGS 宏定义中参数列表的最后一个参数为省略号(也就是三个点)
VA_ARGS 宏前面加上##的作用在于,当可变参数的个数为0时,这里的##起到把前面多余的","去掉的作用