宏定义层层解读

 
最近在看RAC响应编程,在看的过程中,我喜欢先去看一下大致的实现原理,然后有一个大致的原理流程,这样在使用的时候心里不慌。但是在看的过程中,影响我理解的居然是宏定义,看到一堆层层嵌套的宏定义,完全不知道从哪儿下手解读啊。经常看到说宏定义是个黑魔法,现在看来,果然是够黑的,眼前一片漆黑啊。
遂向万能的互联网求助,参考解读文章,有了解读的思想,就可以举起举一反三的大刀,一路冲杀了。
 

1、解读思想的抽剥,层层解析,发现真理

 
以RAC中的metamacro_argcount(…)为例,定义如下:
 
#define metamacro_argcount(...)
        metamacro_at(20, __VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
 
看代码说话,下面1~7,层层剥离,最终得到结果:
其实最终的结果就是计算参数的个数。
 
//最终结果就是获取参数的个数
1、count = metamacro_argcount(1,3,4,5);
 
2、count = metamacro_at(20, 1345, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
 
3、count = metamacro_concat(metamacro_at, 20)(1345, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
 
4、count = metamacro_at20(1345, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
 
5、count = metamacro_head(1345)
 
6、count = metamacro_head_(1345,, 0)
 
7、count = 4      //参数个数

2、现学现卖,分析一下一个比较简单的@weakify(self);

weakify(…)的定义:
#define weakify(...) 
    rac_keywordify 
    metamacro_foreach_cxt(rac_weakify_,, __weak, __VA_ARGS__)
等价剖析:
这个@autoreleasepool {}有何用,貌似没用,最终结果,就是常见的:
__weak __typeof__(self) _weak_self = (self);
   
1.@autoreleasepool {} metamacro_foreach_cxt(rac_weakify_,, __weak, self)
 
2.@autoreleasepool {} metamacro_concat(metamacro_foreach_cxt, metamacro_argcount(self))(rac_weakify_,, __weak, self)
 
3、@autoreleasepool {}metamacro_foreach_cxt1(rac_weakify_,, __weak, self)
 
4、@autoreleasepool {}rac_weakify_(0, __weak, self)
 
5、@autoreleasepool {} __weak __typeof__(self) metamacro_concat(self, _weak_) = (self)
 
6、@autoreleasepool {} __weak __typeof__(self) _weak_self = (self)
 
注:    “#”:字符串化操作符,将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串
            “##”:符号连接操作符,将宏定义的多个形参名连接成一个实际参数名
            “@#“:字符化操作符,将传入的单字符参数名转换成字符,以一对单引用括起来。
            “”:行继续操作符
原文地址:https://www.cnblogs.com/sunjianfei/p/7930038.html