在C語言中比較常用的可變參數(shù)就是printf();函數(shù)原型如下:
int printf(const char * format,...);
寫一個(gè)簡(jiǎn)單的可變參數(shù):
#include
void va_fun(int i,...);
int main(void)
{
va_fun(100);
va_fun(200,100);
va_fun(100,200,300);
}
void va_fun(int i,...)
{
va_list arg_ptr;
int j = 0;
va_start(arg_ptr,i);
j = va_arg(arg_ptr,int);
va_end(arg_ptr);
printf("%d %d\n",i,j);
}
這樣就實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的可變參數(shù)。其實(shí)可變參數(shù)是利用宏來實(shí)現(xiàn)的,宏在參數(shù)的堆棧中查找參數(shù)的位置,然后返回。
定義如下:
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 )
其實(shí)就是計(jì)算參數(shù)堆棧中的內(nèi)存地址。
建議少用可變參數(shù),在c++中用多態(tài)實(shí)現(xiàn)就可以。
printf中根據(jù)format中的參數(shù)的個(gè)數(shù)確定后面參數(shù)的個(gè)數(shù)。
int printf(const char * format,...);
寫一個(gè)簡(jiǎn)單的可變參數(shù):
#include
void va_fun(int i,...);
int main(void)
{
va_fun(100);
va_fun(200,100);
va_fun(100,200,300);
}
void va_fun(int i,...)
{
va_list arg_ptr;
int j = 0;
va_start(arg_ptr,i);
j = va_arg(arg_ptr,int);
va_end(arg_ptr);
printf("%d %d\n",i,j);
}
這樣就實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的可變參數(shù)。其實(shí)可變參數(shù)是利用宏來實(shí)現(xiàn)的,宏在參數(shù)的堆棧中查找參數(shù)的位置,然后返回。
定義如下:
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 )
其實(shí)就是計(jì)算參數(shù)堆棧中的內(nèi)存地址。
建議少用可變參數(shù),在c++中用多態(tài)實(shí)現(xiàn)就可以。
printf中根據(jù)format中的參數(shù)的個(gè)數(shù)確定后面參數(shù)的個(gè)數(shù)。