va_list函數學習

當你的函數的參數個數不肯定時,就能夠使用上述宏進行動態處理,這無疑爲你的程序增長了靈活性。html

va_list的使用方法:
a)  首先在函數中定義一個具備va_list型的變量,這個變量是指向參數的指針。
b)  而後用va_start宏初始化變量剛定義的va_list變量,使其指向第一個可變參數的地址。
c)  而後va_arg返回可變參數,va_arg的第二個參數是你要返回的參數的類型(若是多個可變參數,依次調用va_arg獲取各個參數)。
d)  最後使用va_end宏結束可變參數的獲取。
 
在使用va_list是應該注意一下問題:
1)  可變參數的類型和個數徹底由代碼控制,它並 不能智能地識別不一樣參數的個數和類型
2)  若是咱們不須要一一詳解每一個參數,只須要將可變列表拷貝到某個緩衝區,能夠用 vsprintf函數。
3)  由於編譯器對可變參數的函數原型檢查不夠嚴格,對編程查錯不利,不利於咱們寫出高質量的代碼。

 

 1 #include "stdarg.h"
 2 #include <iostream>
 3 
 4 int sum(char* msg, ...);
 5 
 6 int main()
 7 {
 8     int total = 0;
 9     total = sum("hello world", 1, 2, 3);
10     std::cout << "total = " << total << std::endl;
11     system("pause");
12     return 0;
13 }
14 
15 int sum(char* msg, ...)
16 {
17     va_list vaList; //定義一個具備va_list型的變量,這個變量是指向參數的指針。
18     va_start(vaList, msg);//第一個參數指向可變列表的地址,地址自動增長,第二個參數位固定值
19     std::cout << msg << std::endl;
20     int sumNum = 0;
21     int step;
22     while ( 0 != (step = va_arg(vaList, int)))//va_arg第一個參數是可變參數的地址,第二個參數是傳入參數的類型,返回值就是va_list中接着的地址值,類型和va_arg的第二個參數同樣
23     {                          //va_arg 取得下一個指針
24         //不等於0表示,va_list中還有參數可取
25         sumNum += step;
26     }
27     va_end(vaList);//結束可變參數列表
28     return sumNum;
29 }

運行結果:
hello worldios

total=6編程

摘自:http://blog.sina.com.cn/s/blog_149e9d2ec0102wyn8.html函數

相關文章
相關標籤/搜索