我們在調試程序時,經常會使用NSLog函數打印出一些日誌信息。當我們準備發佈程序時,則不希望這樣的調試日誌出現。我們會自定義這個函數,在debug的時候,正常打印出我們所需要的內容,但在release版本時,則關閉日誌輸出。
更多的,我們會這樣去寫:
#ifdef DEBUG
#define SKLog(farmat, ...) NSLog(farmat, ##__VA_ARGS__)
#else
#define SKLog(farmat, ...) nil
#endif
或者更詳細的日誌:
#ifdef DEBUG
#define SKLog(farmat, ...) NSLog(@"file:%s\t function:%s\t line:%d\t %s\n", [[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __FUNCTION__, __LINE__,[[NSString stringWithFormat:farmat, ##__VA_ARGS__] UTF8String])
#else
#define SKLog(farmat, ...) nil
#endif
雖然我們經常這樣去使用這樣的宏,但每個參數究竟是什麼意思呢?
__FILE__ :在編譯時會替換成當前的源文件路徑,本例子中,我們只取源文件名
__FUNCTION__ :在編譯時會替換成當前的函數名稱
__LINE__ :在編譯時會替換成當前的行號
__VA_ARGS__:一個可變參數的宏,前面加##的作用在於,當可變的參數個數爲0時,這裏 ## 起到把前面多餘的逗號‘,’去掉的作用