可變引數列表原始碼剖析

2021-08-20 19:32:23 字數 1335 閱讀 9491

c語言中的可變引數列表,顧名思義,在c語言中有一些特殊的函式,它們的引數不是固定的,可以是多種型別的任意多個引數。

比如最常用的printf函式和scanf函式,通過使用可變引數列表,使函式可以接收》=1個的多種型別的引數。

用printf函式的原型來舉例子:int printf(const char *format,...) ,後面的「...」就是可變引數列表,它在函式定義時作佔位符,用來接受個數和型別不確定的引數。

可變引數列表是通過巨集來實現的,這些巨集定義在stdarg.h 檔案中。該檔案宣告了乙個型別va-list和三個巨集va-start,va-arg,va-end,三個巨集的作用只是用來確定可變引數列表中每個引數的記憶體位址,編譯器是不知道引數的實際數目的。引數中的「..."用於提示此處可能傳遞數量和型別未確定的引數。

可以看一下stdarg.h中的定義:

#define va_start(v,l)	__builtin_va_start(v,l)

#define va_end(v) __builtin_va_end(v)

#define va_arg(v,l) __builtin_va_arg(v,l)

可以看出:

1)va_start原型:

void va_start(va_list ap,paramn);paramn:確定的引數

2)va_arg原型:

void va_arg(va_list ap,type);返回下乙個引數的值

3)va_end原型:

void va_end(va_list ap,type);關閉初始化的列表

再以我自己實現的乙個可變引數列表函式,功能是求一串數的和:

int sum(int n,...)

{ va_list arg;

va_start(arg,n);

int i=0,val,sum=0;

for(i=0;i從上面的例子可以看出,實現可變參的步驟如下:

1)宣告乙個va_list型的變數arg,arg是用來指向第乙個引數的指標,用來訪問引數列表的未確定部分 

2)然後用va_start巨集初始化變數arg,這個巨集的第二個引數是『...』前的最後乙個有名字的引數. 

3)用va_arg來訪問可變的引數,並且賦值於val. va_arg的第二個引數是要讀取的引數的型別,這裡是int型.同時va-arg指向下乙個可變引數

4)使用結束,用va_end巨集結束可變引數.

可變引數的注意事項

①可變引數必須從頭到尾按順序逐個訪問,可以中途停止

②如果一開始就想訪問中間元素是不行的

可變引數列表原始碼的剖析

c語言中的可變引數 1 c語言中的可變引數列表 c語言中有時候會遇到一些引數個數是可變的函式,像scanf,printf等,這些函式內部的引數列表都是可變的。通過將函式實現為可變引數的形式,使得函式可以接受1個以上的任意多個引數。不固定 如函式原型 scanf const char format,解...

可變引數列表原始碼的剖析

在某些情況下我們希望函式引數的個數可以根據實際需要來確定,所以c語言中就提供了一種長度不確定的引數,形如 通過將函式實現為可變引數的形式,可以使得函式可以接受1個以上的任意多個引數。典型的例子有printf scanf 函式等,下面就用printf函式的原型為例分析 int printf const...

可變引數列表原始碼的剖析

首先看看main函式的引數 首先我們得知道main函式是有引數的,那麼我們就來看看main函式的原型 int main int argc,int argv,char envp program statements 那麼我們看到這裡有三個引數 第乙個引數 argc是個整形引數,表示命令行引數的個數 含...