這些函數的定義使用符號 ... 來表示不定參數,如int printf( const char* format, ...);
在內部則是使用 va 系列巨集來實現的
va_list //不定長度型態
void va_start( va_list arg_ptr, prev_param ); //啟始不定長度引數的巨集
type va_arg( va_list arg_ptr, type ); //讀取不定長度引數的巨集
void va_end( va_list arg_ptr ); //結束不定長度引數的巨集
va 系列的巨集定義如下:
#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 )
簡單的範例:
#include
#include
#include
void CLI_TMP(unsigned int type,...);
int main(int argc, char *argv[])
{
char d[10]="ABC";
CLI_TMP(0,10,20,30,d,"ddsfssf",'c');
system("PAUSE");
return 0;
}
void CLI_TMP(unsigned int type,...)
{
va_list argptr;
char temp_buf[256];
int a,b,c;
char *d,*e;
char f;
va_start(argptr, type);
a = va_arg (argptr,int);
b = va_arg (argptr,int);
c = va_arg (argptr,int);
d = va_arg (argptr,char*);
e = va_arg (argptr,char*);
f = va_arg (argptr,int);
strcat(d,"aaa");
va_end(argptr);
printf("%d,%d,%d,%s,%s,%c\n",a,b,c,d,e,f);
}
link from:http://blog.yam.com/ddy1280/article/2095414
沒有留言:
張貼留言