C語言中的可變引數函式

2021-05-22 14:44:35 字數 993 閱讀 6360

先來個例子,後面再說明

上面的程式我在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 下面將在 中講解這幾個巨集的使用方法。第一種方法是在函式內部手動指定可變引數的型別。首先需要知道可變引數的個數,並作為第乙個引數傳入。由於...