//調試用日誌 #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__宏在預編譯時會替換成當前的函數名稱