C語言中的可變引數列表原始碼的剖析與理解

2021-08-16 22:31:52 字數 1222 閱讀 9653

首先寫一段簡單的**用來理解可變引數列表

#include

#include//實現可變引數列表時,必須使用此標頭檔案

int add(int n, ...)

va_end(arg);

return

sum;

}int main()

這是乙個簡單的加法函式,我們用可變引數列表的方式來實現它,它就可以來求任意個數的和。

●可變引數函式的定義方法

函式型別 函式名( int 引數個數, … )

●對可變引數函式的深度理解(以上面的簡單**為例)

●va_list:

在vs2013環境下,將va_list轉到定義得

即為將char* 型別重新命名,所以在上面的**中,

va_list arg;//char* arg;建立乙個字元指標
●va_start(arg, n):

將va_start(arg, n)轉到定義得:

intsizeof(n);//當n的大小為1或2或3位元組時,insizeof(n)=4 

//當n的大小為5或6或7個位元組時,insizeof(n)=8

//...

即上面的**中va_start(arg, n)就可以替換為:

arg=(char *)&n + 4;//把n的位址取出並強制型別轉換為char*型別

//再給n的位址加4並讓arg指向將這個位址

//即讓arg指向引數部分的第乙個引數

●va_arg(arg, int):

將va_arg(arg, int)轉到定義得:

將va_arg(arg, int)進行替換:

sum+=(*(int *)((arg+=4)-4));//先將arg加4的值賦給arg

//使得arg指向的位置向後挪動4個位元組

//再將arg-4 使得表示式結果所產生的位址指向原先的位置

//將所得到的結果強制型別轉換為int*型別並進行解引用

●va_end(arg):

將va_end(arg)轉到定義得:

**就可以替換為:

arg=(char*)0;//讓指標不再指向原來的位置

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

對可變引數解析之前,我們先看乙個栗子 實現乙個函式可以求任意個引數的平均值。宣告乙個va list型別的變數arg,它用於訪問引數列表的未確定部分。這個變數是呼叫va start來初始化的。它的第乙個引數是va list的變數名,第2個引數是省略號前最後一位有名字的引數。初始化過程把arg變數設定為...

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

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

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

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