C++中利用 va_list实现可变参数函数需要注意的问题

在《C++中利用 va_list实现可变参数函数之间的可变参数传递》介绍了用 va_list实现可变参数函数,但笔者在使用过程中发现,该方式如果出现不存在可参数的情况下会出现不可预料的问题。

案例:

void logMessage(const char* fmt, ...)
{
    char buff[4096];
  
    va_list args;
    va_start(args, fmt);
    vsnprintf(buff, 4096, fmt, args);
    va_end(args);
  
    fprintf_s(logFile, buff);
    printf(buff);
    fflush(logFile);
}

当执行语句:

logMessage("test");

由于没有可变参,导致上述函数的结果不可控,可能竜正常运行,也可能出现访问越界或地址访问冲突,具体要看编译器环境。

为了解决该问题,有3个解决办法,一是避免出现不带可变参方式的调用,二是不使用va_list方式的可变参处理,三是针对特定场景进行检测来决定处理方式。

下面是上述函数一种带检测的方法,仅使用于字符串格式化输出:

void logMessageBetter(const char* fmt, ...)
{
    char buff[4096];
  
    if (strchr(fmt, '%%'))
    {
        va_list args;
        va_start(args, fmt);
        vsnprintf(buff, 4096, fmt, args);
        va_end(args);
    }
    else strcpy_s(buff,4096,fmt);
  
    fprintf_s(logFile, buff);
    printf(buff);
    fflush(logFile);
}

小结:

本文介绍了C++语言中利用va_list实现可变参数传递可能遇到的问题,并给出的解决办法。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CP猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值