C/C++语言函数参数里的“...”作用,va_list的使用(stdarg.h)
以Linux “man 手冊(cè)”里的printf函數(shù)聲明為例,談?wù)勎覍?duì)C語(yǔ)言函數(shù)的可變參數(shù)的一點(diǎn)理解。
printf的函數(shù)聲明如下:int printf(const char *format, …); 通常情況下,以這種形式聲明的函數(shù)參數(shù)列表至少需要一個(gè)普通的函數(shù)參數(shù),后面的省略號(hào)不表示省略,而是函數(shù)原型的一部分。
可變參數(shù)的實(shí)現(xiàn)方式:C語(yǔ)言頭文件“stdarg.h”提供了一個(gè)數(shù)據(jù)類(lèi)型va_list和三個(gè)帶參數(shù)的宏(va_start,va_arg和va_end)。其中va_list的聲明如下:typedef char* va_list; va_start使得va_list類(lèi)型的vp指向第一個(gè)可選參數(shù),va_arg返回參數(shù)列表的當(dāng)前參數(shù)并使vp指向參數(shù)列表的下一個(gè)參數(shù),va_end把vp指針清為NULL。
下面以自己編寫(xiě)的一段C/C++代碼來(lái)驗(yàn)證以上實(shí)現(xiàn)方式:
實(shí)例:
// 求參數(shù)列表中可變參數(shù)的和(可指定個(gè)數(shù)) //#include <iostream> //#include <cstdarg> #include <stdio.h> #include <stdarg.h>//求n個(gè)可變參數(shù)的和 int sum(int n, int j, ...) {printf ("n = %d, j = %d\n", n, j);int s = 0;int i = 0;va_list vp;va_start(vp, j); //使得vp指向第一個(gè)可選參數(shù)for(i = 0; i < n; ++i){int va = va_arg(vp, int);//s += va_arg(vp, int);s += va;printf ("vp_arg() = %d\n", va);printf ("s = %d\n", s);}va_end(vp);return s; }int main() { int j = sum(4,3,2,3,4,5,6);printf ("j = %d\n", j);return 0; }結(jié)果:
n = 4, j = 3
vp_arg() = 2
s = 2
vp_arg() = 3
s = 5
vp_arg() = 4
s = 9
vp_arg() = 5
s = 14
j = 14
分析:
函數(shù)sum的功能是求前n個(gè)可變參數(shù)的和,所以對(duì)于函數(shù)調(diào)用“sum(4,3,2,3,4,5,6)”返回值應(yīng)該為前4個(gè)可變參數(shù)的和,即為2+3+4+5=14。
輸出結(jié)果: j=14
?
總結(jié)
以上是生活随笔為你收集整理的C/C++语言函数参数里的“...”作用,va_list的使用(stdarg.h)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python try语句相关(try/e
- 下一篇: C/C++中从文件末尾反向读取N行文件记