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__ ,调试信息的输出就变得灵活多了。

浙公网安备 33010602011771号