Xcode编译报错NSObCRuntime.h等系统文件

错误分析

今天遇到一个比较少见的问题,记录下来,给遇到的人解答下,如下:

runtime是把OC编译成底层的C,他在这里报这个错误,我们应该不会动这个文件(排除),

因为调试就是PCH文件,就想应该是PCH文件写错了,而我的问题就是PCH写错了。把pch文件修改好就编译成功了。

 

PCH文件修改

在PCH文件中,把导入的文件都放在下面的判断中,在OC的环境下再去编译,打印的代码写在最后

    #ifdef __OBJC__

    #endif

自定义NSLog宏输出

1.根据编译条件,Debug时输出带行号的日志,Release时关闭日志

#ifdef DEBUG
#define NSLog(FORMAT, ...) fprintf(stderr,"%s:%d\t%s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#else
#define NSLog(FORMAT, ...) nil
#endif

在调试的时候,会输出(格式:文件名:行号)日志。在Release正式版本的时候,会关闭日志输出。这几行代码最好放在pch文件最后。

 

扩展

最简单的一个例子:

#ifdef DEBUG
#define GCLog(fmt, ...) NSLog((fmt), ##__VA_ARGS__);
#else
#define GCLog(...);

 输出当前方法名

#define GCMethod(...) NSLog(@"%s", __func__);

 使用方法:

GCLog(@"sdf");

 使用宏自定义输出,还可以很方便地管理输出的内容

#ifdef DEBUG  
# define DLog(fmt, ...) NSLog((@"[文件名:%s]\n" "[函数名:%s]\n" "[行号:%d] \n" fmt), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);  
#else  
# define DLog(...);  
#endif

 


参数解释

1. __VA_ARGS__ 是一个可变参数的宏,很少人知道这个宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。宏前面加上##的作用在于,当可变参数的个数为0时,这里的##起到把前面多余的","去掉的作用,否则会编译出错, 你可以试试。
2. __FILE__ 宏在预编译时会替换成当前的源文件名
3. __LINE__宏在预编译时会替换成当前的行号
4. __FUNCTION__宏在预编译时会替换成当前的函数名称
有了以上这几个宏,特别是有了__VA_ARGS__ ,调试信息的输出就变得灵活多了。

 

posted @ 2016-09-09 17:34  <瑾瑜>  阅读(236)  评论(0)    收藏  举报