zoukankan      html  css  js  c++  java
  • 宏定义层层解读

     
    最近在看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)
     
    注:    “#”:字符串化操作符,将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串
                “##”:符号连接操作符,将宏定义的多个形参名连接成一个实际参数名
                “@#“:字符化操作符,将传入的单字符参数名转换成字符,以一对单引用括起来。
                “”:行继续操作符
  • 相关阅读:
    [DP]ARC072E Alice in linear land
    [莫队][离散化]luogu P3709 大爷的字符串题
    [Splay]luogu P2596 书架
    [BSGS][哈希]luogu P3846 可爱的质数
    [机房测试]10.25
    [机房测试]10.24
    [机房测试]10.23
    [机房测试]10.22
    [机房测试]10.21
    区间伸缩算法小礼包
  • 原文地址:https://www.cnblogs.com/sunjianfei/p/7930038.html
Copyright © 2011-2022 走看看