5.9 属性声明:format

news/2024/6/18 23:26:20

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

http://www.niftyadmin.cn/n/872859.html

相关文章

微信开发绑定服务器地址,极其方便的实现微信公众平台服务端开发,2行代码完成服务器绑定,3行代码实现用户消息监听...

项目介绍极其方便的实现微信公众平台服务端开发&#xff0c;2行代码完成服务器绑定&#xff0c;3行代码实现用户消息监听简单封装了所有与微信服务器交互的消息:文本消息、图片消息、图文消息等等 提供了基于springmvc以及基于servlet框架的控制器&#xff0c;集成了微信服务器…

eclipse不能部署web工程解决方法(转)

eclipse不能部署web工程解决方法 从svn上下载新的代码到myeclipse上&#xff0c;但不能部署到myeclipse的tomcat上&#xff0c;提示webRoot错误&#xff0c;研究了半天发现eclipse创建web工程的时候默认创建的是webRoot文件夹&#xff0c;如果修改为其它文件夹如myWeb,创建者不…

5.12 属性声明:constructor destructor

5.12 属性声明&#xff1a;constructor & destructor constructor & destructor 使用方法 __attribute__((constructor)) int init_func(void); //运行main之前就会执行 __attribute__((destructor)) int exit_func(void);

买了服务器之后如何操作系统,买了服务器后怎么操作系统

买了服务器后怎么操作系统 内容精选换一换Linux操作系统以主机板CMOS芯片的时间作为格林尼治标准时间&#xff0c;再根据设置的时区来确定系统的当前时间。但是一般Windows操作系统并不如此&#xff0c;Windows系统直接将CMOS时间认定为系统当前时间&#xff0c;不再根据时区进…

转发“Istio共享代理新模式Ambient Mesh”

Sidecar 模式的一些限制&#xff0c;让这种共享代理模式成为可能&#xff0c;个人觉得mesh靠近路由转发、安全证书相关的核心功能会下沉到宿主机&#xff0c;甚至有可能成为网卡类的硬件设备。笔者觉得下面的两篇文章写的很好&#xff0c;便转发出来。下面也是文章中整理的。1.…

5.13 属性声明:noinline always_inline

5.13 属性声明&#xff1a;noinline & always_inline 使用示例 显示告诉编译器是否使用内联 static inline __attribute__((noinline)) int func(); static inline __attribute__((always_inline)) int func();函数调用开销 保存当前函数现场 跳到调用函数执行 恢复当前…

项目的成功与主担辅担

开发能否成功&#xff0c;在于各个角色是否明白各自应该担当的工作内容&#xff0c;目标要一致&#xff0c;我把项目的角色分为主担、辅担两类&#xff0c;业务开发是项目的主担&#xff0c;对项目负责&#xff0c;管理是辅担&#xff0c;由公司管理部门对项目的过程指标进行检…

5.14 属性声明:mode

5.14 属性声明&#xff1a;mode 属性声明&#xff1a;mode 显式指定数据类型所占的字节数 使用示例 typedef int s8 __attribute__((mode(QI))); typedef unsigned int us8 __attribute__((mode(QI)));mode属性参数 属性参数描述QIAn integer that is as wide as the smal…