C語言基礎 不定引數

2021-08-17 21:11:28 字數 1027 閱讀 7950

在這一節裡我們來學習c語言中另外乙個重要的機制,不定引數。不定引數是指函式可以接收不確定個數的引數,不定引數用...來表示,它必須要寫在正常參數列的後面,例如我們熟知的printf函式:

int printf (char *fmt, ...);

printf的第乙個引數為char* fmt,後面則是不定引數。它表示可以接收任意個數的引數。我們在呼叫這樣的函式時可以向其傳與任意個數的引數,例如:

printf("%d %d\n", 1, 2);

printf("%f %f %f\n", 1.2, 2.3, 3.4);

printf("%d %f %c %s\n", 1, 2.3, 'a', "hello world!");

那麼,我們不禁要問,定義了乙個不定引數的函式,在函式體內如何確定其形參呢?如何取得傳入引數的值呢?

c語言中提供了一種可以獲取不定引數的辦法,就是用std_arg

先來看看std_arg的使用例子:

#include #include int sum(int first, ...)

int main(int argc, char *argv)

首先,我們要使用#include 來包含這個使用否定引數的標頭檔案。然後定義乙個int型別的變數,我們需要使用va_start將函式的第乙個引數傳遞給arg_list,這樣它都才會知道其後面的不定引數。接下來使用va_arg來取得第二個引數值,在取值時需要將其強制轉化為指定型別的變數。在這裡我們是認為引數的型別均為int型,而通常來說我們可以向printf這樣,將第乙個引數做為後續不定引數的型別定義,通過分析fmt字串中的型別來確定後續不定引數的型別。接下來我們通過va_arg再取得第三個引數、第四個引數和第五個引數。最後使用va_end結束不定引數的使用。

當然,在定義函式和呼叫函式時我們都必須清楚函式的所有的引數型別,否則arglist將不能正常工作。

關於arglist的原理有興趣的讀者請參見《函式棧幀》。

C語言不定引數

最近,遇到乙個c語言的不定引數問題。其實,對於c語言的不定引數問題,只需要三個函式就可以搞定了。這三個函式的標頭檔案是,其實下面的三個函式都是乙個巨集定義 macro 這三個函式是 void va start va list ap,last type va arg va list ap,type v...

C語言不定引數函式

眾所周知,c語言不支援函式過載,支援函式過載的是c 究其原因,c語言在編譯函式之後,將 函式名 存放到函式庫,而c 在編譯函式之後,將 函式名 引數型別 引數型別 存放到函式庫 但是,在查詢fcntl函式時,卻發現其函式原型有多個 int fcntl int fd,int cmd int fcntl...

c語言中的不定引數

在採用c語言程式設計時,函式中的形式引數數目通常是確定的,在呼叫的時候要依次給出與形式引數對應的所有實際引數,但在某些情況下希望函式的引數個數可以根據需要確定,如printf,scanf函式等,c編譯器提供了一系列處理這種情況的巨集,以遮蔽不同的硬體平台造成的差異,增加程式的可移植性,這些巨集包括v...