C語言中不定參數(shù)的應(yīng)用
int sumi(int c, ...)
{
va_list ap;
va_start(ap,c);
int i;
int sum = c;
c = va_arg(ap,int);
while(0!=c)
{
sum = sum+c;
c = va_arg(ap,int);
}
return sum;
}
使用這個(gè)函數(shù)的代碼為:
int main(int argc, char* argv[])
{
int i=sumi(1,2,3,4,5,6,7,8,9,0);
return 0;
}
訪問各個(gè)參數(shù)
其實(shí)前文已經(jīng)告訴我們?cè)趺慈ピL問不定參數(shù)。va_start和va_arg函數(shù)可以被結(jié)合起來用于依次訪問每個(gè)函數(shù),他們實(shí)際上都是宏函數(shù)。
在vc6,va_start函數(shù)定義為:
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) (sizeof(int) - 1) )
#define va_start(ap,v) ( ap = (va_list)v + _INTSIZEOF(v) )
其中_INTSIZEOF(n)計(jì)算比n大的sizeof(int)的最小倍數(shù),如果n=101,則_INTSIZEOF(n)為104.
va_start執(zhí)行完畢后,ap指向變量v后第一個(gè)4字節(jié)對(duì)齊的地址。例如,v的地址為0x123456, v的大小為13,則v后面的下一個(gè)與字邊界對(duì)齊的地址為0x123456+0x0D=0x123463再調(diào)整為與4字節(jié)對(duì)齊的下一個(gè)地址,也就是0x123464.
va_arg函數(shù)定義為:
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
分析與va_start一樣,它的結(jié)果是使ap指向當(dāng)前變量的下一個(gè)變量。
這樣,我們只要在開始時(shí)使用va_start把不定參數(shù)列表賦值給ap,然后依次用va_arg獲得不同參數(shù)即可。
潛在問題
評(píng)論