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;

}

猜你喜欢

转载自www.cnblogs.com/priarieNew/p/9756353.html
今日推荐