c語言基於stdarg h的可變引數函式的用法

2022-09-28 03:06:15 字數 1262 閱讀 9063

在開始學習c語言的函式的時候,我們就知道函式的引數個數應該是在函式宣告的時候就指定的,這一點我們沒有任何疑問。但是不知道大家有沒有注意到我們的printf()函式,他的函式引數理論上並不是確定的,而是隨著ehlphjwz匹配字串中的格式控制符的個數控制的。其實當時也沒有程式設計客棧注意到這一點,到是最近,偶然間看到了 《嗨翻c語言》 這本書,這裡就詳細講解了這種可變引數函式的實現原理,今天考試間隙ehlphjwz就順帶學習了一下,其實就是一種方法,知道了就曉得了,也是非常的簡單。

標頭檔案這個用法需要引用一些巨集,這些巨集定義在c標準庫「stdarg.h」中,(當然c++中就是「cstdarg」了)。

函式宣告

int fun(int arg1,int arg2, ...)

這裡可以用普通傳參方法傳入幾個固定引數,一般情況下會有個表示程式設計客棧可變引數的個數(否則函式也不曉得你到底傳給了他啥),最後表示可變引數部分的是三個連續的點,注意中間不能有空格。我們傳入的可變引數就是在這裡的。

具體用法

這裡主要涉及到va_list型別,va_start()、va_arg()、va_end()這幾個函式。

va_list 可以理解為以鍊錶的形式儲存那些可變引數的乙個資料型別(既然是鍊錶,當然是可變的了)。

void va_start(va_list ap , int len); 接受兩個引數,乙個是上面的那個東西,還有乙個表示資料的數目。目測可以理解為是自動收集傳給本函式的可變引數,並連帶他的數目,將資訊賦給 va_list 。

type va_arg(va_list ap , type ); 接受兩個引數,乙個是va_list,另乙個是儲存的資料的型別。因為在呼叫引數的時候,編譯器不會檢查實際輸入的是什麼引數,所以需要適時的指定,並以那個型別返回。注意,這時候在va_list中的某個指標會指向下乙個元素,所以下一次呼叫時輸出的值就是下乙個元素。在這一點上用法類似於iterator。

void va_end(va_list ap);最後清理這個va_list.

演示原始碼

#include

#include

void print(intarg,...)

va_end(ap);

}int main()

結果自然是輸出 1 2 3 4。

說明雖然看上去效果很酷,但是實際上據說這種用法的確很不安全,容易造成執行錯誤,所以還是盡量要少用。這種類似的問題如果能用過載或者類來解決的話還是少用可變引數函式吧。

本文標題: c語言基於stdarg.h的可變引數函式的用法

本文位址: /ruanjian/c/197122.html

C語言可變引數stdarg h

title date br description c語言可變引數stdarg.h 2020 04 14 03 54 25 0700 可變引數 c語言 stdarg.h中提供了可變引數的寫法 這種函式的原型應該有乙個形參列表,其中至少有乙個形參和乙個省略號,比如,省略號必須是最後乙個引數,省略號的前...

C 可變引數 stdarg h

c語言 stdarg.h標頭檔案定義了乙個使用可變引數的方法,可以用來定義引數個數不固定的函式,其步驟如下 1.提供乙個使用省略號的函式原型 2.在函式定義中建立乙個va list型別的變數 3.用巨集 va start 把該變數初始化為乙個引數列表 4.用巨集va arg 訪問引數列表 5.用巨集...

C語言函式可變引數總結 stdarg h

stdarg.h標頭檔案中定義了一系列巨集以及資料物件,用於支援可變引數的函式。主要有 va list 定義的資料物件 用於存放可變引數列表 省略號部分 代表的參量 va start ap,v 用於將可變引數列表中第乙個參量的位址複製給va list定義的資料物件 va arg ap,t 用於訪問可...