1. 程式人生 > >c語言解決函數變參數問題 va_list

c語言解決函數變參數問題 va_list

res turn pri 定義 etl format) 似的 c語言 mon

前言:
看到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;

}

c語言解決函數變參數問題 va_list