為什么要用“((”取代“(”?
在做日志接口的時候,真實的接口函數應該是如下樣式的:
__static_logger__.log(int level,const char* fmt, ...);
這里使用了printf類似的技術:可變參數。
這個技術可以動態的替換字符串fmt中的內容。
同時,這個方法可能會被重載,用于不需要可變參數的情況:
__static_logger__.log(int level,const char* fmt);
通常,我們還會定義一些輔助用的宏:
#define KLOG(X) \
??? do { \
??????? KDBG::printf X; \
??? } while (0)
使用的時候,必須按照下面的格式:
KLOG((LM_ERROR, "%s\n", strerror(errno)));
注意,使用了雙層的括號“((”
為什么不把宏改成:
#define KLOG(X,Y,...) \
??? do { \
??????? KDBG::log(X,Y,__VA_ARGS__); \
??? } while (0)s
從而按如下的“標準形式”來使用LOG呢?
KLOG(LM_ERROR, "%s\n", strerror(errno));
答案是宏不能像函數那樣重載,KLOG宏只能有一個,就是最后定義的那個,也就是能接受的參數個數是固定的。
posted on 2006-10-13 13:50 HuYi 閱讀(1712) 評論(1) 編輯 收藏 引用 所屬分類: C/C++代碼