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;

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM