# 的意思是紧跟着它的后面的标识符添加一个双引号""
@#的使用, 我们添加一个普通的宏:加@#是怎么使用的:
//随便写一个宏
#define LRToast(str) [NSString stringWithFormat:@"%@",@#str]
//这个宏需要这样写LRToast(温馨提示);//正常运行, 打印不会报错NSLog(@"%@",LRToast(温馨提示));
关于宏定义中的#
1.在一个参数前加一个#,预处理时将会变成这个参数名的字符串常量,即字符串化(stringify)例如:
#define GET_NAME(X) #X
int a = 0;
NSLog(@"%s",GET_NAME(a)); //output: "a"
NSLog(@"%s",GET_NAME(a+3)); //output: "a+3"
2.
#在宏定义中的另一个作用就是用于命名的串联,用##就可以串联它左右两边的命名,比如以下代码:
#define CONCAT(X, Y) X ## Y
NSString *helloworld = @"Hello, world!";
NSLog(@"%@",CONCAT(hello, world)); //output: "Hello, world"
3.
可选可变参数
##在宏定义中可以放在__VA_ARGS__之前表示可变参数可以为空,否则的话可变参数至少为一个了。
#define MYLOG(format, ...) NSLog(format, ##__VA_ARGS__)
MYLOG(@"Don't make an error!");
上面代码中MLOG中只有一个参数,如果不加##,则MLOG至少需要两个参数,在Xcode里将会出现编译错误。