赞
踩
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
one parameter loading...
2 parameter loading...
3 patameter loading...
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。