va_list

//compile:gcc va_arg.c
//run:./a.out
//Notes:如果遇到获取char,type用int,如果该用char会提示...传递时被提升为int。此处使用的编译器是Linux下的gcc
#include<stdio.h>
#include<stdarg.h>
#define filename "filemark"
//***************************************
#define DEBUG_Xu__Jiayu(format,...) DEBUG_(format,##__VA_ARGS__)//有可变参数个数的函数名替换
void DEBUG_(const char*format,...)
{

va_list thethis;
va_start(thethis,format); //可变参数获取可变部分头地址

FILE*fp=fopen(filename,"a+");//打开文件,不存在新建
if(NULL==fp)return ;
vfprintf(fp,format,thethis);//写文件,这个可以处理va_list
fclose(fp);//关闭文件

va_end(thethis);
}
//**************************************
typedef char byte;
void write_byte(const int cnt,...)
{
va_list args;//char*args;
va_start(args,cnt);//(args=(va_list)(&cnt)+_INTSIZEOF(cnt));
int i=0;
for(;i<cnt;i++)
{
//注释的提升到int
byte t=va_arg(args,int);//char:int

printf("%c\n",t);
}

va_end(args);//(args=(va_list)0);
}
//*************************************
void write_str(const int cnt,...)
{
va_list args;//char*args;
va_start(args,cnt);//(args=(va_list)(&cnt)+_INTSIZEOF(cnt));
int i=0;
for(;i<cnt;i++)
{

char* c=va_arg(args,char*);//char*:char*

printf("%d=%s\n",i,c);

}

va_end(args);//(args=(va_list)0);
}
//***********************************
void write_dif(const char c,...)
{
va_list args;//char*args;
va_start(args,c);//(args=(va_list)(&cnt)+_INTSIZEOF(cnt));
int i=0;
int cnt=va_arg(args,int);
if(c=='c')
for(i=0;i<cnt;i++)
{
char cc=va_arg(args,int);//char:int函数传递后char提升为int
printf("%d=%c\n",i,cc);
}
else if(c=='s')
for(i=0;i<cnt;i++)
{

char* s=va_arg(args,char*);//char*:char*

printf("%d=%s\n",i,s);

}
else if(c=='d')
for(i=0;i<cnt;i++)
{

int dt=va_arg(args,int);//int:int

printf("%d=%d\n",i,dt);

}
else printf("wrong parameter\n");




va_end(args);//(args=(va_list)0);
}
//***********************************
int main(int argc,char*argv[])
{
printf("...##__VA_ARGS__宏*********\n");
DEBUG_("one parameter loading...\n");
DEBUG_("%d parameter loading...\n",2);
DEBUG_("%d patameter %s...\n",3,"loading");
printf("save in file :filemark\n%s",
"you could check it from using shell \"cat filemark\"in Linux system\n");

//查看shell命令
//cat filemark
printf("\nNotes:如果遇到获取char,type用int,如果该用char会提示...传递时被提升为int。此处使用的编译器是Linux下的gcc\n");
//*******************************************
printf("...va_list:char************\n");
write_byte(0);
write_byte(4,'m','a','r','k');
//*********************************************
printf("...va_list:string**********\n");
write_str(0);
write_str(2,"mystr","strend");
//*********************************************
printf("...va_list:char,string,int*\n");
printf("char***********************\n");
write_dif('c',2,'o','k');
printf("string*********************\n");
write_dif('s',3,"this","is","string");
printf("int************************\n");
write_dif('d',4,1,2,5,8);
printf("wrong mark*****************\n");
write_dif('w',2,'w',"string");
return 0;
}



屏幕结果

...##__VA_ARGS__宏*********
save in file :filemark
you could check it from using shell "cat filemark"in Linux system

Notes:如果遇到获取char,type用int,如果该用char会提示...传递时被提升为int。此处使用的编译器是Linux下的gcc
...va_list:char************
m
a
r
k
...va_list:string**********
0=mystr
1=strend
...va_list:char,string,int*
char***********************
0=o
1=k
string*********************
0=this
1=is
2=string
int************************
0=1
1=2
2=5
3=8
wrong mark*****************
wrong parameter


执行一次文件结果【shell:cat filemark】:

one parameter loading...
2  parameter loading...
3  patameter loading...