宏定义层层解读

 
最近在看RAC响应编程,在看的过程当中,我喜欢先去看一下大体的实现原理,而后有一个大体的原理流程,这样在使用的时候内心不慌。可是在看的过程当中,影响我理解的竟然是 宏定义,看到一堆层层嵌套的 宏定义,彻底不知道从哪儿下手解读啊。常常看到说宏定义是个黑魔法,如今看来,果真是够黑的,眼前一片漆黑啊。
遂向万能的互联网求助, 参考解读文章,有了解读的思想,就能够举起触类旁通的大刀,一路冲杀了。
 

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

 
以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      //参数个数

 

二、现学现卖,分析一下一个比较简单的@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)
 
注:    “#”:字符串化操做符,将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串
            “##”:符号链接操做符,将宏定义的多个形参名链接成一个实际参数名
            “@#“:字符化操做符,将传入的单字符参数名转换成字符,以一对单引用括起来。
            “\”:行继续操做符
相关文章
相关标签/搜索