文章出處
文章列表
根據編譯條件,Debug時輸出帶行號的日志,Release時關閉日志
/* XCode LLVM XXX - Preprocessing中Debug會添加 DEBUG=1 標志 */ #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
把以上代碼粘貼到ProjectName-Prefix.pch文件中。
(找不到文件:http://www.cnblogs.com/KeenLeung/p/5020542.html)
在調試的時候,會輸出(格式:文件名:行號)日志。
在Release正式版本的時候,會關閉日志輸出。
擴展:
最簡單的一個例子:
#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__ ,調試信息的輸出就變得靈活多了。
參考:
http://my.oschina.net/u/211651/blog/290477
http://blog.csdn.net/gavinming/article/details/7218574
http://www.cnblogs.com/GarveyCalvin/p/4157553.html
http://blog.chinaunix.net/uid-22878837-id-2110544.html
文章列表
全站熱搜