当前位置:   article > 正文

Linux下函数可变参数va_arg_##__VA_ARGS__宏___va_arg__

__va_arg__


va_list

  1. //compile:gcc va_arg.c
  2. //run:./a.out
  3. //Notes:如果遇到获取char,type用int,如果该用char会提示...传递时被提升为int。此处使用的编译器是Linux下的gcc
  4. #include<stdio.h>
  5. #include<stdarg.h>
  6. #define filename "filemark"
  7. //***************************************
  8. #define DEBUG_Xu__Jiayu(format,...) DEBUG_(format,##__VA_ARGS__)//有可变参数个数的函数名替换
  9. void DEBUG_(const char*format,...)
  10. {
  11. va_list thethis;
  12. va_start(thethis,format); //可变参数获取可变部分头地址
  13. FILE*fp=fopen(filename,"a+");//打开文件,不存在新建
  14. if(NULL==fp)return ;
  15. vfprintf(fp,format,thethis);//写文件,这个可以处理va_list
  16. fclose(fp);//关闭文件
  17. va_end(thethis);
  18. }
  19. //**************************************
  20. typedef char byte;
  21. void write_byte(const int cnt,...)
  22. {
  23. va_list args;//char*args;
  24. va_start(args,cnt);//(args=(va_list)(&cnt)+_INTSIZEOF(cnt));
  25. int i=0;
  26. for(;i<cnt;i++)
  27. {
  28. //注释的提升到int
  29. byte t=va_arg(args,int);//char:int
  30. printf("%c\n",t);
  31. }
  32. va_end(args);//(args=(va_list)0);
  33. }
  34. //*************************************
  35. void write_str(const int cnt,...)
  36. {
  37. va_list args;//char*args;
  38. va_start(args,cnt);//(args=(va_list)(&cnt)+_INTSIZEOF(cnt));
  39. int i=0;
  40. for(;i<cnt;i++)
  41. {
  42. char* c=va_arg(args,char*);//char*:char*
  43. printf("%d=%s\n",i,c);
  44. }
  45. va_end(args);//(args=(va_list)0);
  46. }
  47. //***********************************
  48. void write_dif(const char c,...)
  49. {
  50. va_list args;//char*args;
  51. va_start(args,c);//(args=(va_list)(&cnt)+_INTSIZEOF(cnt));
  52. int i=0;
  53. int cnt=va_arg(args,int);
  54. if(c=='c')
  55. for(i=0;i<cnt;i++)
  56. {
  57. char cc=va_arg(args,int);//char:int函数传递后char提升为int
  58. printf("%d=%c\n",i,cc);
  59. }
  60. else if(c=='s')
  61. for(i=0;i<cnt;i++)
  62. {
  63. char* s=va_arg(args,char*);//char*:char*
  64. printf("%d=%s\n",i,s);
  65. }
  66. else if(c=='d')
  67. for(i=0;i<cnt;i++)
  68. {
  69. int dt=va_arg(args,int);//int:int
  70. printf("%d=%d\n",i,dt);
  71. }
  72. else printf("wrong parameter\n");
  73. va_end(args);//(args=(va_list)0);
  74. }
  75. //***********************************
  76. int main(int argc,char*argv[])
  77. {
  78. printf("...##__VA_ARGS__宏*********\n");
  79. DEBUG_("one parameter loading...\n");
  80. DEBUG_("%d parameter loading...\n",2);
  81. DEBUG_("%d patameter %s...\n",3,"loading");
  82. printf("save in file :filemark\n%s",
  83. "you could check it from using shell \"cat filemark\"in Linux system\n");
  84. //查看shell命令
  85. //cat filemark
  86. printf("\nNotes:如果遇到获取char,type用int,如果该用char会提示...传递时被提升为int。此处使用的编译器是Linux下的gcc\n");
  87. //*******************************************
  88. printf("...va_list:char************\n");
  89. write_byte(0);
  90. write_byte(4,'m','a','r','k');
  91. //*********************************************
  92. printf("...va_list:string**********\n");
  93. write_str(0);
  94. write_str(2,"mystr","strend");
  95. //*********************************************
  96. printf("...va_list:char,string,int*\n");
  97. printf("char***********************\n");
  98. write_dif('c',2,'o','k');
  99. printf("string*********************\n");
  100. write_dif('s',3,"this","is","string");
  101. printf("int************************\n");
  102. write_dif('d',4,1,2,5,8);
  103. printf("wrong mark*****************\n");
  104. write_dif('w',2,'w',"string");
  105. return 0;
  106. }


屏幕结果

  1. ...##__VA_ARGS__宏*********
  2. save in file :filemark
  3. you could check it from using shell "cat filemark"in Linux system
  4. Notes:如果遇到获取char,type用int,如果该用char会提示...传递时被提升为int。此处使用的编译器是Linux下的gcc
  5. ...va_list:char************
  6. m
  7. a
  8. r
  9. k
  10. ...va_list:string**********
  11. 0=mystr
  12. 1=strend
  13. ...va_list:char,string,int*
  14. char***********************
  15. 0=o
  16. 1=k
  17. string*********************
  18. 0=this
  19. 1=is
  20. 2=string
  21. int************************
  22. 0=1
  23. 1=2
  24. 2=5
  25. 3=8
  26. wrong mark*****************
  27. wrong parameter

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/483173
推荐阅读
相关标签
  

闽ICP备14008679号