|
|
发表于 2005-5-20 10:24:01
|
显示全部楼层
Post by Tetris
不是吧?这个很明显是个不定参数的宏里调用一个不定参数的函数(cpLog_impl_)啊。
cpLog_impl_ (priority__, __FILE__, __LINE__, fmt__ , ##args__);
看函数的第4个参数fmt(format)就知道了,cpLog_impl_是一个和sprintf有点像的函数,可能它还会再调用vsprintf。
你说的不错,但你没有理解我的意思。
比如说有这样一个宏定义:
#define err_log(fmt, ...) fprintf(stderr, fmt, __VA_ARGS__)
这就要求可变参数中到少有一个参数。如果我想这样用
err_log("open file failed\n");
那么经过宏扩展后,就会变成:
fprintf(stderr, "open file failed\n", );
在fprintf的参数列表中最后的逗号后面没有参数。在编译时就会报错。
如果定义成
#define err_log(fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__)
在扩展后就会变成:
fprintf(stderr, "open file failed\n");
这样就不会报错。
这样做可以给错误信息的输出带来一定的灵活性。 |
|