在c語言中,有乙個方法可以使用可變引數,可變引數是指,函式的有一些引數不是必要的。一些程式語言中,這些引數通常有一些預設值。
比如c++中的可變引數
int myfunc(int a, int b, int ab=0)else
}
在myfunc函式頭中ab引數有乙個預設值0,也就是說這個函式可以使用兩個或三個引數,a,b是必要的,ab不是必要的。如果ab是空的,則預設是0.
比如myfunc(1,2)返回3.
myfunc(1,2,3)返回6.
標準c函式的可變引數
標準c函式裡面沒有像上文提到的可變引數,但是如果你使用像printf這樣的函式,你可以用1個,2個甚至更多的引數。比如
printf("printf with no specifier format\n");
printf("printf with %s specifier format \n","one");
printf("printf with %s specifier format %s","two","arguments");
那printf是怎麼做到的呢?
在c中使用引數列表,你必須首先包含乙個stdarg.h的標頭檔案,函式的引數列表至少有乙個寫出名字的引數,剩下的引數可以用「...」表示。比如
#include
void myfunc2(int a, int b, ...)else
}
在函式中,我們需要乙個va_list的變數來儲存引數列表的元素,va_start函式用來把va_list指向引數列表,在這之前,我們需要讓va_start知道什麼最後乙個標明的引數,也就是寫出名字的引數。在上面的例子中,就是b.
va_arg函式可以乙個乙個的得到引數元素並把它放在另外乙個變數中,如果呼叫va_arg函式他會把指標移動到參數列中的下乙個引數,當所有的引數都儲存到其他變數中之後,我們必須呼叫va_end函式。
上面的例子myfunc2函式跟上文的c++函式是一樣的。
via:
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...
C語言 可變引數函式
可變引數函式,即引數個數可變的函式。返回值 函式名 固定引數m個,可變引數n個 其中,m 1,n 0,即 至少需要乙個固定引數,否則你怎麼定位到引數呢?固定引數的宣告與普通函式引數相同 可選引數由於數目不定 0個或以上 宣告時用 表示 用作引數佔位符 固定引數和可選引數共同構成可變引數函式的引數列表...