在做日志接口的時(shí)候,真實(shí)的接口函數(shù)應(yīng)該是如下樣式的:
__static_logger__.log(int level,const char* fmt, ...);
這里使用了printf類似的技術(shù):可變參數(shù)。
這個(gè)技術(shù)可以動(dòng)態(tài)的替換字符串fmt中的內(nèi)容。
同時(shí),這個(gè)方法可能會(huì)被重載,用于不需要可變參數(shù)的情況:
__static_logger__.log(int level,const char* fmt);
通常,我們還會(huì)定義一些輔助用的宏:
#define KLOG(X) \
??? do { \
??????? KDBG::printf X; \
??? } while (0)
使用的時(shí)候,必須按照下面的格式:
KLOG((LM_ERROR, "%s\n", strerror(errno)));
注意,使用了雙層的括號(hào)“((”
為什么不把宏改成:
#define KLOG(X,Y,...) \
??? do { \
??????? KDBG::log(X,Y,__VA_ARGS__); \
??? } while (0)s
從而按如下的“標(biāo)準(zhǔn)形式”來(lái)使用LOG呢?
KLOG(LM_ERROR, "%s\n", strerror(errno));
答案是宏不能像函數(shù)那樣重載,KLOG宏只能有一個(gè),就是最后定義的那個(gè),也就是能接受的參數(shù)個(gè)數(shù)是固定的。