C語言可變引數的使用

2021-06-28 20:50:21 字數 1955 閱讀 1510

可變引數函式指的是函式引數個數不固定的函式,類似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 獲...