美文网首页
读懂复杂宏的小技巧

读懂复杂宏的小技巧

作者: 口子窖 | 来源:发表于2018-06-06 16:23 被阅读100次

    一、什么是宏

    百度百科的解释是:计算机科学里的宏(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);
        }];
    

    我们用输出的代码替代那段宏,程序会有同样的结果
    看看这结果还是蛮复杂的吧,下次再遇到看不懂宏的就用这个小技巧,保证事半功倍!!

    相关文章

      网友评论

          本文标题:读懂复杂宏的小技巧

          本文链接:https://www.haomeiwen.com/subject/gfabsftx.html