在做日志接口的时候,真实的接口函数应该是如下样式的:
__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宏只能有一个,就是最后定义的那个,也就是能接受的参数个数是固定的。