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
#include 
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);//支持多种格式
}

你可能感兴趣的:(5.9 属性声明:format)