5.9 属性声明:format

5.9 属性声明:format

format使用方法

_attribute_((format (archetype, string-index, first-to-check)))
archetype 对应的函数
string-index 格式字符串在函数终端的位置
first-to-check 开始检查的参数的位置

 void LOG(const char *fmt, ...) __attribute__((format(printf,1,2))) ;

例程

#include<stdio.h>
#include<stdarg.h> 
void print_num(int count,...)
{
   int *args;
   args = &count + 1;//args+1*sizeof(int)
   for(int i=0;i<count;i++)
   {
   	printf("*args: %d\n",*args);
   	args++;
   }
}

void print_num2(int count,...)
{
   char *args;
   args = (char *)&count + 4;//args+1*sizeof(int)
   //传入的参数是一个int
   for(int i=0;i<count;i++)
   {
   	printf("*args: %d\n",*(int *)args);
   	args += 4;
   }
}
/*利用GNU 对可变参数的支持
va_list
va_start ( , )
*/
void print_num3(int count,...)
{
   va_list args;
   va_start(args,count);//根据第一个参数回自动回去下一个参数的地址
   for(int i=0;i<count;i++)
   {
   	printf("*args: %d\n",*(int *)args);
   	args += 4; 
   }
}

#define DEBUG
void __attribute__((format(printf,2,3))) LOG(int k,char *fmt,...)
//LOG 函数的参数检查按printf的规则
{
#ifdef DEBUG
   va_list args;
   va_start(args,fmt);
   vprintf(fmt,args);
   va_end(args);
#endif
}

//int main(int argc,char *argv[])
int main(void)
{
   int i=10;
   print_num(5,1,2,3,4,5);
   print_num2(5,1,2,3,4,5);
   print_num3(5,1,2,3,4,5);
   LOG(4,"size:%d %d %f\n",i,20,3.14);
   return 0;
}

printf支持多种类型

void print_str(char *fmt,...)
{
	va_list args;
	va_start(args,fmt);//获取下一个参数
	vprintf(fmt,args);//支持多种格式
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值