C可變引數列表函式

2021-07-03 05:54:11 字數 1341 閱讀 5378

c語言中可以定義接收不同的引數的函式

可變引數的函式可以接收不同數目的引數,但是需要注意的是c語言中函式的引數個數不能超過5個。

可變引數的函式的原型如下int narg_sum(int arg_num, ... )在引數列表中至少要有乙個命名的引數。

可變引數函式的實現需要用到va_start、va_arg、va_end這三個巨集和va_list的資料型別,這些巨集定義在stdarg.h。 

va_list:用來儲存巨集va_start、va_arg和va_end所需資訊的一種型別。為了訪問變長引數列表中的引數,必須宣告va_list型別的乙個物件 。

va_start:訪問變長引數列表中的引數之前使用的巨集,它初始化用va_list宣告的物件,初始化結果供巨集va_arg和va_end使用。

va_arg: 展開成乙個表示式的巨集,該表示式具有變長引數列表中下乙個引數的值和型別。每次呼叫va_arg都會修改 用va_list宣告的物件,

從而使該物件指向引數列表中的下乙個引數;

va_end:該巨集使程式能夠從變長引數列表用巨集va_start引用的函式中正常返回

例項如下:

#include

#include

//不支援float

int narg_sum(int arg_num, ... )

va_end(list_arg);

return sum;

}double args_sum(int init_sum, ... )

int main(int argc,char** argv)

注意,可變引數不能用float變數,在之前寫該例項的時候,用了float變數的時候,一直不知道出現了啥問題,後來發現是不支援如下的type型別。

且一般我們要知道怎麼該省略的引數的一些引數順序。如double args_sum函式中的引數型別是int、int和double這三個順序 。

在給函式傳遞引數時,引數應該由事先的引數確定型別順序,同時可以少於之預設引數的個數,但是型別要匹配。

下面列出va_arg(argp, type)巨集中不支援的type:

—— char、signed char、unsigned char

—— short、unsigned short

—— signed short、short int、signed short int、unsigned short int

—— float

可變引數 函式 可變引數列表 1

我們在c語言程式設計中有時會遇到一些引數個數可變的函式,即函式的入參個數和型別是不確定的,例如printf 函式,其函式原型為 int printf char format,它除了有乙個引數format固定以外,後面跟的引數的個數和型別是可變的 用三個點 做引數佔位符 實際呼叫時可以有以下的形式 p...

可變引數列表函式實現

如題 我們在寫可變引數列表函式之前,先來了解一下什麼是可變引數列表函式。我們在c語言程式設計中有時會遇到 一些引數個數可變的函式,例如printf 函式,其函式原型為 int printf const char format,它除了有乙個引數format固定以外,後面跟的引數個數和型別是可變的 用三...

可變引數列表

模擬實現printf函式 va list是在c語言中解決變參問題的一組巨集,所在標頭檔案 include 用於獲取不確定個數的引數 va start,函式名稱,讀取可變引數的過程其實就是在堆疊中,使用指標,遍歷堆疊段中的引數列表,從低位址到高位址乙個乙個地把引數內容讀出來的過程 va arg,這個巨...