c++ 变长参数

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;
    }

}

おすすめ

転載: blog.csdn.net/struborn_b/article/details/106736146