C語言變長引數實現

2021-07-02 13:20:39 字數 867 閱讀 8168

#include#include#include/***編寫可變長引數列表的函式案例*/

/*void minprintf(char *fmt,...)這個函式只處理格式字串和引數,格式的轉換則通過printf函式實現

省略號表示引數的數量和型別是可變的,省略號只能出現再參數列的尾部,minprintf不需要像printf

函式返回實際輸出的字元數,所以可以返回型別設定為void

編寫minprintf關鍵在於如何處理乙個甚至連名字都沒有的參數列,標準標頭檔案中包含一組巨集定義

,他們對如何遍歷參數列進行了定義,該標頭檔案的實現因不同的機器而不同,但提供的介面都是一致的。

va_list型別用於宣告乙個變數,該變數依次引用各引數,在函式minprintf中,將該變了成為ap,意思是引數

指標,在使用ap前,該巨集必須先被呼叫一次,參數列至少包含乙個有名引數,va_start將最後乙個有名引數

做為起點,每次呼叫,va_arg,該引數返回乙個引數,並將ap指向下乙個引數,va_arg使用乙個型別名來決定

返回物件的型別,指標移動的步長,最後必須在函式返回之前呼叫va_end,以便完成一些必要的清理工作。*/

void minprintf(char *fmt,...)

switch (*++p)

break;

default :

putchar(*p);

break;}}

va_end(ap);

}int sum(int m,...)

va_end(ap);//結束時候的清理工作

return sum;

}int main(int argc,char *argv)

C語言變長引數處理

va list 是c語言中解決變長引數問題的一組巨集 va list的用法 1 首先在函式裡定義乙個va list型別的變數,這個變數是指向引數的指標 2 然後用va start巨集初始化剛定義的va list變數,這個巨集的第二個引數是第乙個可變引數的前乙個引數,是乙個固定的引數 3 然後用va ...

C語言可變長引數

在使用可變長引數時發現的乙個問題,首先先放一段 和它的執行結果 產生這樣結果的原因就在於va start的第二個引數不同 原先一直以為va start的第二個引數是引數的個數,查了一些資料,找到va start的定義後發現,va start的第二個引數是可變長引數最左邊的位址。va start的定義...

C語言中變長引數例項

include include define sum arg.sum my name is arg char sum char a,變長引數的實現基於的是 c 語言預設的 cdecl 呼叫慣例中 自右向左壓棧的傳遞方式 比如 sum a,b,c 的各個引數在 棧中的相對順序為 top of stac...