zoukankan      html  css  js  c++  java
  • Log

    #define DLog(format, ...) fprintf(stderr,"<%s : %s : %d>  %s
    ",                                 
                        [[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String],   
                        __FUNCTION__, __LINE__,                                                      
                        [[NSString stringWithFormat:format, ##__VA_ARGS__] UTF8String]);

    在iOS开发中,很大一部分时间我们通过控制器的Log信息调试我们的项目,很多情况下我们会对这行Log信息所处的文件位置(文件名)、方法、行数信息非常关系,上面自定义的宏就满足了我们的大部分需求了。

    下面,我们就来说说它。

    1.DLog(format, ...)

    我们看到的是一个函数宏【宏分类:对象宏(object-like macro)和函数宏(function-like macro)】,但是它的参数比较奇怪,第二个参数是...,在宏定义(其实也包括函数定义)的时候,写为...的参数被叫做可变参数(variadic)。可变参数的个数不做限定。在这个宏定义中,除了第一个参数format将被单独处理外,接下来输入的参数将作为整体一并看待。回想一下NSLog的用法,我们在使用NSLog时,往往是先给一个format字符串作为第一个参数,然后根据定义的格式在后面的参数里跟上写要输出的变量之类的。这里第一个格式化字符串即对应宏里的format,后面的变量全部映射为...作为整体处理。

    2.fprintf

    fprintf(<#FILE *restrict#>, <#const char *restrict, ...#>)

    int fprintf (FILE *restrict, const char *restrict, [argument])

    FILE *restrict:文件指针;

    const char *restrict:输出格式化说明符(可参考我的博客C语言格式化说明符)

    [argument]:附加参数列表;
     
    可以看到 "FILE *restrict" ,这个参数我们使用的宏 “stderr”
    含义:【unix】标准输出(设备)文件,默认输出到终端窗口。
     
    3.
    __FILE__ : 文件的完整路径和文件名(绝对路径)。
    __LINE__:当前行数。
    __FUNCTION__:当前调用的方法或函数名。
     
    由于文件路径中可能会存在中文,所以我们需要对获取到的路径进行UTF-8转码,第二次转码转为C字符串类型 ‘const char *’类型:
    [[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String]

    __VA_ARGS__:表示的是宏定义中的...中的所有剩余参数。在这里展开的时候编译器会将__VA_ARGS__直接替换为输入中从第二个参数开始的剩余参数。

    ## :表示将前面的格式化字符串和后面的参数列表合并。

    学习更多的宏,可参考喵神的宏定义黑魔法

    尊重作者劳动成果,转载请注明: 【kingdev】
  • 相关阅读:
    isMemberOf与isKindOf的区别
    当你的工程出现了问题,在别的电脑上可以正常运行。你该怎么做。。
    iOS 声明属性关键字的总结
    UISegmentedControl方法与属性的总结
    UILabel与UIFont的用法和属性的一些总结
    UIActivityIndicatorView控件的属性和方法
    第四百六十一天 how can I 坚持
    《Java基础知识》Java集合(Collection)
    《Java基础知识》Java线程的概念
    《Java基础知识》Java断言
  • 原文地址:https://www.cnblogs.com/xiu619544553/p/5369323.html
Copyright © 2011-2022 走看看