可用__VA_ARGS__代表不确定参数 "..."

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", ...);这显然是错误的使用。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值