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

13 篇文章 0 订阅
2 篇文章 0 订阅


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...

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值