stdarg.h標頭檔案中定義了一系列巨集以及資料物件,用於支援可變引數的函式。
主要有:
va_list //定義的資料物件 用於存放可變引數列表(省略號部分)代表的參量
va_start(ap,v) //用於將可變引數列表中第乙個參量的位址複製給va_list定義的資料物件
va_arg(ap,t) //用於訪問可變引數列表中參量內容,第一次呼叫訪問第乙個可變參量,第二次呼叫訪問第二個可變參量.. 以此類推
va_end() //用於清理工作
c語言的可變引數函式與c++中的函式多型類似,但又比函式多型的某些方面具有更大的優勢。例如在c++中想定義三種不同長度的同名函式(多型)則需要分別定義三個該函式 以此類推 若想定義支援四種不同長度的同名函式,則需要分別定義4次:
void func(int n1)
void func(int n1,int n2)
void func(int n1,int n2,int n3)
而在c中,則不用這麼麻煩,只需要定義乙個可變引數的函式即可(而且c中是不允許出現多個同名函式的 因為沒有多型機制):
void func(int n,...) 支援:func(1,66) func(2,34,50) func(5,13,50,34,91,81)....任意數量的引數呼叫
下面定義乙個簡單的支援可變引數的函式:
void paint(int n,...){
va_list varp; //定義乙個用於存放可變引數列表的位址的變數
va_start(varp,n); //將可變引數列表的位址複製給上面定義的varp變數中
int value; //用於臨時存放可變引數列表中的值
for(int i=0;i
該函式用於向螢幕輸出所有可變引數列表的值,引數中的n用於指定可變引數列表的的引數個數,用於內部遍歷該可變引數列表的參量。
例如有如下**:
paint(1,66); //引數n為1 代表可變引數列表有1個引數(66)
paint(3,11,22,33); //引數n為3 代表可變引數列表有3個引數(11,22,33)
paint(5,64,50,13,41,55); //引數n為5 代表可變引數列表有5個引數(64,50,13,41,55)
可變引數列表有幾個引數是需要作為引數傳遞給函式的,讓函式知道可變引數列表中有多少個引數,內部好進行處理。
當然也可以這麼定義:
void paint(...); //不指定可變引數列表有多少個引數 但是這樣內部處理時也不知道有多少個引數 沒有意義
以上是我對c語言函式中可變引數的小小總結,如有錯誤,請多指教,謝謝了。 C語言 可變引數函式總結
1.可變引數函式 可變引數函式,顧名思義,即函式的引數個數是可變的,例如 printf 的函式原型是 int printf const char format,可變引數函式的宣告形式基本類似 只是在引數列表最尾部有乙個引數 format 和 乙個可變引數標誌 三個點 2.相關的巨集 在實現可變引數函...
C語言函式可變引數
翻apue的時候,看到了一組可變引數的巨集就是va list 類似 void print arg int count,1 va list變數 ifdef m alpha typedef struct va list else typedef char va list 這個 endif 2 intsi...
C語言可變引數函式
今天在c和指標書中第一次接觸到這個函式,以前有碰到過這樣可變引數的問題,但無從下手。原來c語言還是有這樣的功能,感覺c真是無所不能。c函式要在程式中用到以下這些巨集 void va start va list arg ptr,prev param type va arg va list arg pt...