DLog

作者: zfl1024 | 来源:发表于2020-02-19 13:51 被阅读0次
#define DLog(format, ...)   do {         \
                    fprintf(stderr,"<%s : %s : %d>  %s\n",                             \
                    [[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String],   \
                    __FUNCTION__, __LINE__,                                                      \
                    [[NSString stringWithFormat:format, ##__VA_ARGS__] UTF8String]);            \
} while (0) 

在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】标准输出(设备)文件,默认输出到终端窗口。

FILE : 文件的完整路径和文件名(绝对路径)。
LINE:当前行数。
FUNCTION:当前调用的方法或函数名。

由于文件路径中可能会存在中文,所以我们需要对获取到的路径进行UTF-8转码,第二次转码转为C字符串类型 ‘const char *’类型:
[[[NSString stringWithUTF8String:FILE] lastPathComponent] UTF8String]

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

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

————————————————

更多宏定义链接:
https://onevcat.com/2014/01/black-magic-in-macro/

相关文章

  • DLog

    ///全局函数func DLog(_ message:T,file:String = #file,funcN...

  • DLog

    在iOS开发中,很大一部分时间我们通过控制器的Log信息调试我们的项目,很多情况下我们会对这行Log信息所处的文件...

  • Dlog

  • DLOG2

    我打算叫diarylog……DLOG,有没有很nice?重新发一下dlog1哒内容……补起来,呦呦呦~发了张照片…...

  • 调试 - DLog

    iOS开发中,常常需要打印日志Debug程序,NSLog输出过于单一常常不能满足我们的需求,DLog 能输出行号、...

  • 期末作业

    EH17-Quantum algorithms for DLOG and Factorin 读后总结

  • 日志调试

    //OC版 #ifdef DEBUG #define DLog(fmt, ...) NSLog((@"<%s : ...

  • iOS Bug 调试

    1.打印log调试 #ifdef DEBUG # define DLog(fmt, ...) NSLog((@"[...

  • dlog1

    前两天看了没有阳光的日子,是从香港人的视角看待这一历史事件的,里面谈及了侯孝贤的悲情城市,还采访了很多海外华人。他...

  • Swift Constant File

    //Update 0729 `dlog` 更新:[http://www.jianshu.com/p/e65d7c6...

网友评论

      本文标题:DLog

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