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