一、什么是宏
百度百科的解释是:计算机科学里的宏(Macro),是一种批量处理的称谓。一般说来,宏是一种规则或模式,或称语法替换 ,用于说明某一特定输入(通常是字符串)如何根据预定义的规则转换成对应的输出(通常也是字符串)。这种替换在预编译时进行,称作宏展开。
个人简单的理解就是,宏就是你自己定义的一套代码展开的规则,编译器值负责展开,不负责语法的检验。
二、宏基础
a、无参宏
常用来定义常量
define PI 3.1415926
b、带参宏
define MAX(a, b) ((a)>(b) ? (a) : (b))
d、#操作符
:字符串化一个宏参数
#define STRINFY(arg) #arg
当arg中包含空格的时候,预处理器只会保留中间一个空格,忽略两端空格
d、\操作符
\是换行符,当宏太长一行写不完时,可以使用其换行。
d、#@操作符
@:字符化一个宏参数,即在参数名字前后加上'
#define CHARIZE(arg) #@arg
d、##操作符
:拼接宏参数和另一个符号,连接两个符号生成一个新的符号
#define CONS(arg1, arg2) arg1 ## arg2
注意:如果#、##操作的参数也是一个宏,那么这个宏将不会被继续展开,但是如果确实需要#、##后的宏继续展开,也可以定义辅助宏过度一下:
#define CHARIZE_WITH_MACRO(arg) CHARIZE(arg)
#define SYMBOL_CATENATE_WITH_MACRO(arg1, arg2) SYMBOL_CATENATE(arg1, arg2)
三、技巧
#define TO_STR( x ) TO_STR1( x )
#define TO_STR1( x ) #x
RAC中使用了很复杂的宏,直接读很难读懂,TO_STR可以帮助我们来更快地读懂宏
RAC(self,age) = [RACSignal combineLatest:@[RACObserve(self , username),RACObserve(self , password)] reduce:^(NSString *username, NSString *password){
return @(1);
}];
const char *str = TO_STR(RAC(self,age));
NSLog(@"%s",str);
-
输出结果
dy20180521193332202.jpg
[[RACSubscriptingAssignmentTrampoline alloc] initWithTarget:(self) nilValue:(((void *)0))][@(((void)(__objc_no && ((void)self.age, __objc_no)), "age"))] = [RACSignal combineLatest:@[RACObserve(self , username),RACObserve(self , password)] reduce:^(NSString *username, NSString *password){
return @(1);
}];
我们用输出的代码替代那段宏,程序会有同样的结果
看看这结果还是蛮复杂的吧,下次再遇到看不懂宏的就用这个小技巧,保证事半功倍!!
网友评论