c++在支持变长参数时,用到了三个宏,va_start、va_arg、va_end,和一个数据类型va_list。
谈谈我对他们使用上理解吧
va_list ptr; //首先定义一个该类型的指针
va_start(ptr,parm1) //该类型指针和入参的第一个参数关联
type = va_arg(ptr, tpye) //该类型指针返回一个第二个参数的值,此处做循环,这种方式不好判断什么时候结束,所以我建议用vsprintf_s替代
如:char* p = va_arg(ptr, char*)、 int a = va_arg(ptr, int)
va_end(prt)//释放该指针
例子:
void LogInfo(char *szMsg, ...)
{
va_list marker;
CTime t = CTime::GetCurrentTime();
CString strTime;
strTime.Format(_T("[%d-%d-%d %02d:%02d:%02d]: "), t.GetYear(), t.GetMonth(), t.GetDay(), t.GetHour(), t.GetMinute(), t.GetSecond());
strTime += szMsg;
va_start(marker, szMsg);
int len = _vscprintf( szMsg, marker );
int nBufLen = len + 128;
char *szBuf = new char[nBufLen] ;
memset(szBuf, 0, nBufLen);
vsprintf_s(szBuf, nBufLen, ws2s(strTime.GetBuffer()).c_str(), marker);
va_end(marker);
char szPath[MAX_PATH] = "c:\\LogonUI.log";
FILE *fp = NULL;
if (NULL != (fp = fopen(szPath, "a+")))
{
fseek(fp, 0, SEEK_END);
fwrite(szBuf, strlen(szBuf), 1, fp);
fwrite("\n", 1, 1, fp);
fclose(fp);
}
if (NULL != szBuf)
{
delete[]szBuf;
szBuf = NULL;
}
}