可变形参
1、系统中有一些关于可变形参的方法,#include<stdarg.h>
va_list实际上只是一个参数指针,
va_start根据你提供的最后一个固定参数来获取第一个可变参数的地址,
va_arg将指针指向下一个可变参数然后返回当前值,
va_end只是简单的将指针清0.
string SumStrNew(int nCount, ...)
{
string str;
va_list vl = 0; //参数指针
va_start(vl, nCount); //获得第一个参数开始
for(int i=0; i<nCount; ++i)
{
char* p = va_arg(vl, char*); //得到当前参数值,然后指向下一个参数
cout << p << endl;
str += p;
}
cout << "SumStrNew:" << str << endl << endl;
return str;
}
2、利用可变参数打印调试信息到文件中
#define Dump(fp, ...) debug_print(fp, __FILE__, __LINE__, __FUNCTION__, __VA_ARGS__)//打印源文件名、行号、函数名、参数
会调用一些系统的输出方法:vsprintf按照%d%s...等格式来输出、vsprintf_s、fputs、fflush
void debug_print(FILE * fp, const char * filename, const int line, const char * funcname, char *fmt, ...)
{
if(NULL != fp)
{
char buf[BUF_SIZE];
time_t t;
struct tm * now;
va_list ap;
time(&t);
now = localtime(&t);
va_start(ap, fmt);
fprintf(fp, "%04d-%02d-%02d %02d:%02d:%02d -- %s(%d):%s DEBUG:@\"", now -> tm_year + 1900, now -> tm_mon + 1, now -> tm_mday, now -> tm_hour, now -> tm_min, now -> tm_sec, filename, line, funcname);
vsprintf_s(buf,BUF_SIZE, fmt, ap);
fprintf(fp, "%s\"@\n", buf);
fflush(fp);
va_end(ap);
}
}