1. 程式人生 > >解析c語言中可變引數列表

解析c語言中可變引數列表

  c語言中的可變引數列是一個比較有意思的實現,通過將函式實現為可變引數的形式,可以使得函式可以接受1個以上的任意多個引數(不固定)。
#include  <stdio.h>
#include <stdarg.h>
int average(int n,...)
{
va_last arg;//char *p
int i=0;
int sum=0;
va_start(arg,n);
for(i=0;i<n;i++)
{
sum+=va_arg(arg,int);
}
return sum/n;
va_end(arg)//P=NULL;
}
int main()
{
int a=1;
int b=2;
int c=3;
int avg1=average(2,a,c);
int avg2=average(3,a,b,c);
printf("avg1=%d\n",avg1);
printf("avg2=%d\n",avg2);
return 0;
}

1>宣告一個va_last型別的變數arg,它用於訪問引數列表的未確定部分。

2>這個變數是呼叫va_start來初始化的,它的第個引數是va_last的變數名,第二個引數是省略號的最後一個有名字的引數,初始化過程把arg變數設定為指向可變引數部分的第一個引數。

3>為了訪問引數,需要使用va_arg,這個巨集接收兩個引數:va_list變數和引數列表中下一個引數的型別。在這個例子中所有的可變引數都是整形。va_arg···返回這個引數的值,並使用va_arg···指向下一個可變引數。

4>最後,當訪問完畢最後一個可變引數之後,我們需要呼叫va_end。

可變引數的限制

注意:

1)可變引數必須從頭到尾逐個訪問。如果你在訪問了幾個可變引數之後想半途終止,這是可以的。但是,如果你一開始就像訪問引數列表中間的引數,那是不行的。

2)引數列表中至少有一個命名引數。如果連一個命名引數都沒有,就無法使用va_start。

3)這些巨集是無法直接判斷實際存在引數的數量。

4)在va_arg中指定了錯誤的型別,那麼其後果是不可預測的。