可變引數的c c 函式

2021-06-20 01:44:19 字數 1731 閱讀 6427

最近在寫遊戲的時候看到書上寫了個virtual void displaytext(int id, long x, long y,

unsigned long color,

char *text, ...) = 0;

當我看到這個函式時,我和小夥伴們都驚呆啦,我的娘,這是神馬函式,還帶省略號的,難道是書上寫錯了?然後我抱著試試看的心理上網搜了一下,原來是我孤陋寡聞了,唉,說道這裡童鞋們要明白讀書的重要性,自己懂的知識是很有限的,好了,廢話不多說,進入正題。

我上網搜了很多大牛的部落格,最後也總算弄懂了函式的使用,在這裡給大家總結一下

上面那個很神秘的函式原來叫可變引數的函式,就是省略號代表可變引數,大家可以新增n個引數(n >= 0)

在這種函式裡要使用幾種我們之前沒見過的資料結構和函式

va_lis arg_ptr:定義乙個指向個數可變的引數列表指標arg_ptr

va_start(arg_ptr, argn):使引數列表指標arg_ptr指向函式引數列表中的第乙個可選引數,也就是…裡的第乙個引數,argn要設定成最後乙個固定引數。如果有一va函式的宣告是void va_test(char a, char b, char c, …),則它的固定引數依次是a,b,c,最後乙個固定引數argn為c,因此就是va_start(arg_ptr, c)。

va_copy(dest, src):dest,src的型別都是va_list,va_copy()用於複製引數列表指標,將dest初始化為src。

va_end(arg_ptr):清空引數列表,並置引數指標arg_ptr無效。說明:指標arg_ptr被置無效後,可以通過呼叫va_start()、va_copy()恢復arg_ptr。每次呼叫va_start() / va_copy()後,必須得有相應的va_end()與之匹配。引數指標可以在引數列表中隨意地來回移動,但必須在va_start() … va_end()之內。

◎用法:

func( type para1, type para2, type para3, ... )

下面看乙個具體的實現**:

#include#includevoid ******_va_fun(int start, ...)

while(nargvalue != -1); 

va_end(arg_ptr);

}int main(int argc, char* argv)

執行結果截圖如下

其中va_list、va_start、va_end定義在stdarg.h標頭檔案中

下面以******_va_fun(100,200,-1);為例進行講解

呼叫******_va_fun函式的時候通過va_start讓argptr指標一開始指向...裡的第乙個引數(也就是200這個引數的位址),然後呼叫printf函式輸出第nargcount個引數的值,這裡初始化nargcount為0,然後先++nargcount,就是輸出第乙個,也就是100,再執行nargvalue = va_arg(arg_ptr,int);,把當前arg_ptr指向的引數的值賦給nargvalue,並使arg_ptr指向下乙個引數,由於一開始已經通過va_start使arg_ptr指向第二個100的位址,所以此時nargvalue值為200,如此迴圈下去一直到nargvalue == -1,也就是讀完了可變引數,最後呼叫va_end(arg_ptr)結束可變引數的獲取,理解了麼小夥伴們

C C 可變引數函式

可變引數的函式,即函式的引數個數和引數型別不完全確定的函式。這類函式最常見的就是printf scanf函式。在c c 中,為了通知編譯器函式有可變引數,必須以三個點結束該函式的宣告。例如 printf函式的宣告 int printf const char format,scanf函式宣告 int ...

C C 可變引數函式

標頭檔案 include 函式宣告 int add int count,函式定義 int add int count,函式呼叫 int main 邊長引數模板相當於乙個模板的遞迴展開模型,但是它不是遞迴的。使用的時候,要定義乙個 遞迴 的出口,然後定義一系列的操作,操作的是以 遞迴 的方式進行的。遞...

C C 可變引數

函式 使用va list巨集組解決變參問題 1 首先定義va list型的變數,這個變數是指向引數的指標。2 然後用va start巨集初始化剛定義的va list變數,這個巨集的第二個引數是 第乙個可變引數的前乙個引數 3 再用va arg得到可變引數,第二個引數是 可變引數 的型別。4 最後用v...