經常使用日誌宏書寫方式

//調試用日誌
#define __DEBUG_LOG_LEVEL__   0
#if   1 == __DEBUG_LOG_LEVEL__  //printf
#define  MONITOR_LOG   printf
#elif 2 == __DEBUG_LOG_LEVEL__
#define  MONITOR_LOG(fmt,...)   printf("%s(%d): "fmt, __FILE__, __LINE__, ##__VA_ARGS__)
#elif 3 == __DEBUG_LOG_LEVEL__
#define  MONITOR_LOG(fmt,...)   printf("%s(%d)-<%s>: "fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__)
#else
#define  MONITOR_LOG
#endif
#define MONITOR_LOG_DEBUG(...) \
 MONITOR_LOG(__VA_ARGS__); \
 WRITE_DBG_LOG(__VA_ARGS__);
#define MONITOR_LOG_INFO(...) \
 MONITOR_LOG(__VA_ARGS__); \
 WRITE_INFO_LOG(__VA_ARGS__);
#define MONITOR_LOG_WARN(...) \
 MONITOR_LOG(__VA_ARGS__); \
 WRITE_WARN_LOG(__VA_ARGS__);
#define MONITOR_LOG_ERR(...) \
 MONITOR_LOG(__VA_ARGS__); \
 WRITE_ERR_LOG(__VA_ARGS__);
#define MONITOR_TO_LOG_FILE(filepath, fmt, ...) \
 MONITOR_LOG(fmt, __VA_ARGS__); \
 WRITE_TO_LOG_FILE(filepath, fmt, __VA_ARGS__);




上面的宏是使用qDebug輸出調試信息,在非Qt的程序中也能夠改成printf,守護進程則能夠改成syslog等等...  其中,決竅其實就是這幾個宏 ##__VA_ARGS__, __FILE__, __LINE__ 和__FUNCTION__,下面介紹一下這幾個宏:
  1)  __VA_ARGS__ 是一個可變參數的宏,不多人知道這個宏,這個可變參數的宏是新的C99規範中新增的,目前彷佛只有gcc支持(VC6.0的編譯器不支持)。宏前面加上##的做用在於,當可變參數的個數爲0時,這裏的##起到把前面多餘的","去掉的做用,不然會編譯出錯, 你能夠試試。
  2) __FILE__ 宏在預編譯時會替換成當前的源文件名
  3) __LINE__宏在預編譯時會替換成當前的行號
  4) __FUNCTION__宏在預編譯時會替換成當前的函數名稱
相關文章
相關標籤/搜索