c語言解決函數變參數問題 va_list
阿新 • • 發佈:2018-10-08
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