2011-7-20
可用__VA_ARGS__代表不确定参数 "..."
"..."代表所有不确定的参数,而__VA_ARGS__则用在宏中代表"..." 因为有时候"..."不能代表所以有了这个宏.一般编程时输出的调试信息都会写成宏来控制输出方式(这与错误和警告提示不同,错误警告由等级控制)
void func (void)
{
int i = 1;
int j = 2;
debugInfo("i = %d,j = %d", i, j);
}
我们可以定义:#define debugInfo printf 用printf输出
如果不打算输出的时候:#define debugInfo(x) 显然不行,因为我们不知道参数个数,所以可以这样定义:#define debugInfo(...),还有一种也可以实现:#define debugInfo 虽然编译器会警告。
但是如果遇到以下这种情况呢?
void func (void)
{
int i = 1;
int j = 2;
debugInfo(stdout, "i = %d,j = %d", i, j);
}
我们打算用printf代替debugInfo,应该怎么办呢?
显然#define debugInfo printf 是不行的,因为格式不同。
这时候就需要用到__VA_ARGS__了,用__VA_ARGS__代表"..."。
#define debugInfo(stdout, fmt, ...) printf(fmt, __VA_ARGS__) 或
#define debugInfo(stdout, fmt, ...) printf(fmt, ##__VA_ARGS__) (加##是为了处理只有一个参数的时候,不会导致带入前面的逗号)
这里参数传递用__VA_ARGS__代表"..."。
#define debugInfo(stdout, fmt, ...) printf(fmt, ...) 这样是错误的,模拟一下宏的替换过程就很容易理解了。相当于:printf("i = %d,j = %d", ...);这显然是错误的使用。