《C標準庫》中可變引數函式的具體含義和使用

2021-10-03 12:14:32 字數 2477 閱讀 8523

c 標準庫 -

** 描述

c 庫巨集 void va_start(va_list ap, last_arg) 初始化 ap 變數,它與 va_arg 和 va_end 巨集是一起使用的。 last_arg 是最後乙個傳遞給函式的已知的固定引數,即省略號之前的引數。

這個巨集必須在使用 va_arg 和 va_end 之前被呼叫。

** 宣告

下面是 va_start() 巨集的宣告。

void va_start(va_list ap, last_arg);

** 引數

ap – 這是乙個 va_list 型別的物件,它用來儲存通過 va_arg 獲取額外引數時所必需的資訊。

last_arg – 最後乙個傳遞給函式的已知的固定引數。

** 返回值

na

示例

#include

#include

intsum

(int,.

..);

intmain

(void

)int

sum(

int num_args,..

.)va_end

(ap)

;return val;}--

----

----

----

----

----

----

----

----

----

----

----

-讓我們編譯並執行上面的程式,這將產生以下結果:

10、20 和 30 的和 =

604、20、25 和 30 的和 =

79

c 標準庫 - c 標準庫 -

** 描述

c 庫巨集 type va_arg(va_list ap, type) 檢索函式引數列表中型別為 type 的下乙個引數。它無法判斷檢索到的引數是否是傳給函式的最後乙個引數。

** 宣告

下面是 va_arg() 巨集的宣告。

type va_arg(va_list ap, type)

** 引數

ap – 這是乙個 va_list 型別的物件,儲存了有關額外引數和檢索狀態的資訊。該物件應在第一次呼叫 va_arg 之前通過呼叫 va_start 進行初始化。

type – 這是乙個型別名稱。該型別名稱是作為擴充套件自該巨集的表示式的型別來使用的。

** 返回值

該巨集返回下乙個額外的引數,是乙個型別為 type 的表示式。

示例

#include

#include

intsum

(int,.

..);

intmain()

intsum

(int num_args,..

.)va_end

(ap)

;return val;}--

----

----

----

----

----

----

----

----

----

----

----

讓我們編譯並執行上面的程式,這將產生以下結果:

15 和 56 的和 =

71

c 標準庫 - c 標準庫 -

** 描述

c 庫巨集 void va_end(va_list ap) 允許使用了 va_start 巨集的帶有可變引數的函式返回。如果在從函式返回之前沒有呼叫 va_end,則結果為未定義。

** 宣告

下面是 va_end() 巨集的宣告。

void va_end(va_list ap)

** 引數

ap – 這是之前由同一函式中的 va_start 初始化的 va_list 物件。

** 返回值

該巨集不返回任何值。

示例

#include

#include

intmul

(int,.

..);

intmain()

intmul

(int num_args,..

.)va_end

(ap)

;return val;}--

----

----

----

----

----

----

----

----

----

----

----

--讓我們編譯並執行上面的程式,這將產生以下結果:15*

12=180

C中可變引數函式

先說明規則 1.函式的可變引數中必須有一條確定的引數 至少一條 2.可變引數列表必須從頭開始訪問,訪問到尾部 3.可變引數列變不能確定引數數目 編譯時才能確定 4.可變引數的變數型別是不確定的,編譯時必須確定引數型別,變數的引數型別不確定時,函式的結果未知。引數使用方法 include va lis...

函式中的可變引數c

在資料的大小,個數,型別是未知的情況下,會用到可變引數。include include include 標準引數,解決可變引數問題 intadd int num,va end argp 結束讀取 return res void main include include include 標準引數,解決...

C 中函式中的可變引數

using system using system.collections.generic using system.linq using system.text vfun values console.writeline vfun aaa bbb ccc console.writeline say...