iOS:你真的理解你在用的自定義NSLog嗎?

自定義NSLog
我們?cè)谡{(diào)試程序的時(shí)候,往往需要輸出一些日志信息,用到NSLog函數(shù),當(dāng)我們準(zhǔn)備發(fā)布程序,需要注釋掉NSLog代碼,這個(gè)時(shí)候往往會(huì)定義一個(gè)宏,在調(diào)試的時(shí)候,會(huì)輸出日志,在Release正式版本的時(shí)候,會(huì)關(guān)閉日志輸出。代碼如下:

#ifdef DEBUG
#define CLog(format, ...) NSLog(format, ## __VA_ARGS__)
#else
#define CLog(format, ...)
#endif

上面這段代碼,是最常見的自定義NSLog的方式,但是上面的這段代碼有一定的局限性,就是日志信息不夠明確,如果打印N多信息的話,容易造成混淆。那么,我們?cè)撊绾屋敵龈鼮樵敿?xì)的日志信息呢?

#ifdef DEBUG  
# define DLog(fmt, ...) NSLog((@"[文件名:%s]\n" "[函數(shù)名:%s]\n" "[行號(hào):%d] \n" fmt), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);  
#else  
# define DLog(...);  
#endif

筆者測試如下:


代碼
日志信息

雖然上面這段代碼用起來非常方便,可能會(huì)有很多的讀者和我一樣,并不理解,為什么要這么定義,里面的一些參數(shù)到底是什么意思?

參數(shù)解釋:

  1. __VA_ARGS__是一個(gè)可變參數(shù)的宏,很少人知道這個(gè)宏,這個(gè)可變參數(shù)的宏是新的C99規(guī)范中新增的,目前似乎只有g(shù)cc支(VC6.0的編譯器不支持)。宏前面加上##的作用在于,當(dāng)可變參數(shù)的個(gè)數(shù)為0時(shí),這里的##起到把前面多余的","去掉的作用,否則會(huì)編譯出錯(cuò), 你可以試試。
  2. __FILE__宏在預(yù)編譯時(shí)會(huì)替換成當(dāng)前的源文件名

3.__LINE__宏在預(yù)編譯時(shí)會(huì)替換成當(dāng)前的行號(hào)
4.__FUNCTION__宏在預(yù)編譯時(shí)會(huì)替換成當(dāng)前的函數(shù)名稱
有了以上這幾個(gè)宏,特別是有了__VA_ARGS__,調(diào)試信息的輸出就變得靈活多了。
看完這段解釋,讀者應(yīng)該對(duì)自定義NSLog有更深的理解了。

參考
http://www.cnblogs.com/GarveyCalvin/p/4157553.html
http://blog.csdn.net/laomai/article/details/276274
http://stackoverflow.com/questions/21873616/how-to-use-va-args-properly

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容