c语言解决函数变参数问题 va_list

前言:

看到sprintf,swprintf之类的可变参数格式化函数,是否想过我们能写一个自定义的类似的函数吗?答案是很定的,下面来介绍一种方法,用va_list,va_start, va_end来实现。

va_list是一个宏,使用的时候先定义一个变量,然后用va_start来初始化,使用完后用va_end来结束。使用时我们可以分析每一个参数,这时要使用va_argc,但是没有方法知道有多少个参数。所以可以简单的将参数格式化输出到一个缓冲区里,需要使用函数vsprintf。

举一个简单的小例子:

#include "stdafx.h"
#include <Windows.h>

void varPrint(char *format, ...)
{
        va_list va;          //定义变量
        va_start(va, format); //初始化变量
        char szMsg[0x30] = { 0 };
        //简单的将消息输出到缓冲区里,返返回的是缓冲区的字符个数,不包括'\0'
        int nCount = vsnprintf_s(szMsg, sizeof(szMsg), sizeof(szMsg)-sizeof(char), format, va);
  
        int argc1 = va_arg(va, int);//第一个参数为va_list变量,第二个参数为要返回的数据类型
        int argc2 = va_arg(va, int);//。。。。。。。。
        int argc3 = va_arg(va, int);

        va_end(va);//最后释放资源
        printf_s("result:%s", szMsg);
}

int _tmain(int argc, _TCHAR* argv[])
{
        SYSTEMTIME sysTime = { 0 };
        CHAR szMsg[512] = { 0 };
        GetLocalTime(&sysTime);
       //这里的格式化信息将在调用中输出
        varPrint("Msg:%d-%d-%d %d", sysTime.wYear, sysTime.wMonth, sysTime.wDay, sysTime.wDayOfWeek);
        getchar();
        return 0;

}