简单总结一下 变参函数调用变参函数(备忘)
一、调用函数的格式为:fun(*, va_list ) //“*”表示可能有一个或多个参数,这里旨在介绍最后一个参数是va_list类型的情况
以printf()的实现为例,下面是printf()函数的源码:
int printf(const char *fmt, ...)
{
char printf_buf[1024];
va_list args;
int printed;
va_start(args, fmt);
printed = vsprintf(printf_buf, fmt, args);
va_end(args);
puts(printf_buf);
return printed;
}
这个就一目了然了。
二、调用函数格式为:fun(*, ...) //旨在介绍最后一个参数为 ... 类型的情况
我举个例子:
#define MAX_LEN 256
void fun1(const char* a_format, ...);
void fun2(const char* a_format, ...)
{
char temp[MAX_LEN] = {0};
va_list ap;
int iRet;
va_start (ap, a_format);
iRet= vsprintf (temp, a_format, ap);
assert (iRet< MAX_LEN);
fun1 ("%s", temp);
va_end (ap)
}
这里使用了vsprintf()函数,该函数的功能是:送格式化输出到串中。在这里可能会出现内存溢出情况,建议使用vsnprintf()函数。
把
iRet= vsprintf (temp, a_format, ap);
assert (iRet< MAX_LEN);
改成:
iRet = vsnprintf(temp, MAX_LEN, a_format, ap);
assert(-1 < iRet && MAX_LEN > iRet);
注:va_list , va_start(), va_end(), vsprintf(), vsnprintf()函数都是在stdarg.h头文件中。
博主所有文章已转自私人博客Joe 的个人博客,谢谢关注!