先來個例子,後面再說明
上面的程式我在vc6.0編譯通過
現在說一下可變引數的用法
第一步:函式宣告 functionname(char * format, ...)
第二步:定義va_list 變數 ap;
第三步:使ap和引數列表關聯起來va_start(ap,format);
第四步:你可以按照引數列表即format字串接收你的引數。
使用va_arg(ap, 引數型別);
va_arg巨集會按照引數型別從ap中依次取得乙個你傳入的變數值,
在例子中,我沒有按照format進行格式讀取,我想這個不影響你對變引數的理解。
程式的最後使用va_end(ap);釋放掉ap;
原理:(一種可能的實現方法)
假設引數壓棧為從前往後從下往上;
即test(a,b,c,d);
會先壓a入棧最後壓d;
而棧低指標小於棧頂指標;
於是typedef char * va_list;
#define va_start(ap,v) ( ap = (va_list)&v + sizeof(char*))
#define va_arg(ap,t) ((t *)(ap += sizeof(t))[-1]
#define va_end(ap) ( ap = (va_list)0 )
另外:1、設定快取setbuf(stdout, buf);
2、int_max等巨集在 limits.h中定義
3、檔案a.c中定義了char str ="test";在其他檔案中使用,則如下宣告 --> extern char str;或c++中的const char *str;
4、 errno 儲存著錯誤編號
以上僅是理論,實際中很少直接寫變參函式,都是變相呼叫系統函式實現。實現模板如下
int writeformat(char* format, ...)
C語言中函式可變引數解析
大多數時候,函式中形式引數的數目通常是確定的,在呼叫時要依次給出與形式引數對應的所有實際引數。但在某些情況下希望函式的引數個數可以根據需要確定。典型的例子有 大家熟悉的函式printf scanf 可變引數的實現 c語言標頭檔案stdarg.h提供了乙個資料型別va list和三個巨集 va sta...
實現c語言中的可變引數函式
c語言程式設計中有時會遇到一些引數個數可變的函式,例如printf 函式,其函式原型為 int printf const char format,它除了有乙個引數format固定以外,後面跟的引數的個數和型別是可變的 用三個點 做引數佔位符 實際呼叫時可以有以下的形式 printf d i prin...
C語言中可變引數函式的實現
c語言的可變引數函式的實現需要使用標頭檔案stdarg.h,在該標頭檔案中定義了乙個變數型別va list和三個巨集va start va arg va end 下面將在 中講解這幾個巨集的使用方法。第一種方法是在函式內部手動指定可變引數的型別。首先需要知道可變引數的個數,並作為第乙個引數傳入。由於...