宏定義層層解讀

 
最近在看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)
 
注:    「#」:字符串化操做符,將宏定義中的傳入參數名轉換成用一對雙引號括起來參數名字符串
            「##」:符號鏈接操做符,將宏定義的多個形參名鏈接成一個實際參數名
            「@#「:字符化操做符,將傳入的單字符參數名轉換成字符,以一對單引用括起來。
            「\」:行繼續操做符
相關文章
相關標籤/搜索