在《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实现可变参数传递可能遇到的问题,并给出的解决办法。