1. va_list相關函數的學習:html
va_list是一種變參量的指針類型定義.ios
va_list使用方法以下:編程
1)首先在函數中定義一個具備va_list型的變量,這個變量是指向參數的指針。函數
2)首先在函數中定義一個具備va_list型的變量,這個變量是指向參數的指針。學習
3)而後va_arg返回可變參數,va_arg的第二個參數是你要返回的參數的類型(若是多個可變參數,依次調用va_arg獲取各個參數)。spa
4)最後使用va_end宏結束可變參數的獲取。指針
在使用va_list是應該注意一下問題:code
1) 可變參數的類型和個數徹底由代碼控制,它並不能智能地識別不一樣參數的個數和類型。htm
2) 若是咱們不須要一一詳解每一個參數,只須要將可變列表拷貝到某個緩衝區,能夠用vsprintf函數。blog
#include "stdarg.h" #include <iostream> #include <stdio.h> static char buf[512]; int sum(char* msg, ...); int main(void) { int total = 0; char str[] = "%dhello%dworld!%d"; total = sum(str, 1, 2, 3); std::cout << "total = " << total << std::endl; return 0; } int sum(char* msg, ...) { va_list vaList; //定義一個具備va_list型的變量,這個變量是指向參數的指針。 va_start(vaList, msg);//第一個參數指向可變列表的地址,地址自動增長,第二個參數位固定值 std::cout << msg << std::endl; int sumNum = 0; int step,i; vsnprintf(buf,sizeof(buf),msg,vaList); for(i=0;i<30;i++){ printf("%c",buf[i]); } while ( 0 != (step = va_arg(vaList, int))) //va_arg第一個參數是可變參數的地址,第二個參數是傳入參數的類型,返回值就是va_list中接着的地址值,類型和$ { //va_arg 取得下一個指針 //不等於0表示,va_list中還有參數可取 sumNum += step; } va_end(vaList);//結束可變參數列表 return sumNum; }
Reference: