我自闲庭信步,悠然自得,不亦乐乎.

                                       ------ Keep life simple
GMail/GTalk/MSN:huyi.zg@gmail.com

 

为什么要用“((”取代“(”?

在做日志接口的时候,真实的接口函数应该是如下样式的:
__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 阅读(1677) 评论(1)  编辑 收藏 引用 所属分类: C/C++代码

评论

# re: 为什么要用“((”取代“(”? 2007-10-22 16:45 jadedrip

#define KLOG(X) \
do { \
KDBG::printf (X); \
} while (0)

KLOG(LM_ERROR, "%s\n", strerror(errno));

起码可以少写2个括号……
  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

常用链接

留言簿(12)

随笔分类

相册

收藏夹

友情链接

最新随笔

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜