C語言函式可變引數總結 stdarg h

2021-08-03 05:38:11 字數 1477 閱讀 6300

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...