可變引數函式指的是函式引數個數不固定的函式,類似printf(char* fmt, …);
如果想自己寫乙個可變引數的函式,需要用到stdarg.h標頭檔案中的如下幾個巨集
void va_start( va_list arg_ptr, prev_param );
type
va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
-用法example.c
#include
#include
void myprint(char* fmt, ...)
}va_end(ap);
}int main()
執行結果:
int
11string str1
int12
string str2
char @
程式詳解
1.首先定義可變引數函式時引數列表中使用(…)代表引數個數不確定,但是一定至少要有乙個固定的引數,這裡用 的是(char * fmt).
2. 定義va_list ap用來訪問未列出的引數
va_list 、va_start、va_arg、va_end的定義如下
typedef
char* va_list
#define _intsizeof(n) \
((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )
#define va_start(ap,v) \
( ap = (va_list)&v + _intsizeof(v) )
#define va_arg(ap,t) \
( *(t *)((ap += _intsizeof(t)) - _intsizeof(t)) )
#define va_end(ap) ( ap = (va_list)0 )
va_list ap定義的ap是乙個指標。
va_start(ap,fmt) 將ap初始化賦值,指向第乙個未列出的引數。
va_arg 每次返回乙個引數的值,並且將ap後移至下乙個引數位址
這個結合棧來看會更清晰,c語言的函式是從右至左入棧的,
高位址|-----------------------------|
|函式返回位址 |
|-----------------------------|
|....... |
|-----------------------------|
|第n個引數(第乙個可變引數) |
|-----------------------------|<--va_start後ap指向
|第n-1個引數(最後乙個固定引數)|
|-----------------------------|<-- &fmt
低位址|-----------------------------|
va_end(ap) 將ap賦值為0,不指向任何地方。
注意:
ch = (char)va_arg(ap, int);
不能使用 ch=(char)va_arg(ap, char);
va_arg(argp, type)巨集中不支援的type:
— char、signed char、unsigned char
— short、unsigned short
— signed short、short int、signed short int、unsigned short int
— float
float 用double代替,其他的用 int代替,char* 是可以用的。
參考 [
[
C語言可變引數使用介紹
我們可能常常在linux c中看見一些函式,特別是輸出函式,或可以格式轉化的函式,比如printf等函式,他的引數是可變的。int printf const char format,int vprintf const char format,va list ap int vfprintf file ...
C語言可變引數如何使用
編寫乙個名叫max list的函式,它用於檢查任意數目的整型引數並返回它們中最大值,引數列表必須以負值結尾,提示列表結束。這個題目的重點是任意數目的整型引數,所以並不確定傳入的引數數量,這裡就可以使用可變引數。include include int max list int x,printf tmp...
c 語言可變引數
1 當無法列出傳遞函式的所有實參的型別和數目時,可用省略號指定參數列 void foo void foo parm list,2 函式引數的傳遞原理 函式引數是以資料結構 棧的形式訪問,從右至左入棧.eg include void fun int a,int main output 12 343 獲...