文章出處

根據編譯條件,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

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()