打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
IAR-ARM 带变参数宏定义

http://blog.csdn.net/daoweifan/article/details/6368686

2011

在C99中已经有对可变参数宏的扩展,在IAR的帮助文档中,有这样的描述  __VA_ARGS__ :


 

__VA_ARGS__

Syntax

#define P(...)       __VA_ARGS__#define P(x, y, ...)   x + y + __VA_ARGS__

__VA_ARGS__ will contain all variadic arguments concatenated, including the separating commas.

Description

Variadic macros are the preprocessor macro equivalents of printf style functions. __VA_ARGS__ is part of the C99 standard.

Example

#if DEBUG  #define DEBUG_TRACE(S, ...) printf(S, __VA_ARGS__)#else  #define DEBUG_TRACE(S, ...)#endif/* Place your own code here */DEBUG_TRACE("The value is:%d/n",value);

will result in:

printf("The value is:%d/n",value);
    这样子,我们在进行可变参数传递的时候,可以参数上面的方案。但是,上的处理方法,在IAR ARM 4.X的环境中会有问题,当我们禁用DEBUG的时候,编译有时候会出错:
比如:
       DEBUG_TRACE("This is a ideal day!");,
      这样语句会报错,报错类型为参数不对。在DEBUG_TRACE所要求的参数与这条语句中的参数不一样。
   
      DEBUG_TRACE("This is number %d", value);
      上面的语句就不会报错。

这样,我们从于调试考虑的宏定义就没有多大的意义了,因为不好禁用调试。

 

但是,有另外一种方案,这样方案是一种技巧性的:

 

#if DEBUG

#define DEBUG_TRACE(args)    (printf args)

#else

#define DEBUG_TRACE(args)

#endif

 

但是在调用DEBUG_TRACE时候,要用两个引号:

DEBUG_TRACE(("This is a good day!"));

DEBUG_TRACE(("This is number %d",value));

这样是可用的。太牛B了,当DEBUG使能的时候,其为可变参数,当DEBUG禁能的时候,其为固定参数,因而可以通过编绎链接!

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
使用 Printf via SWO/SWV 输出调试信息
Windows下C/C可变参数宏实现技巧
可变参数及可变参数宏的使用
C语言的宏中定义可变参数
宏定义中的##操作符和... and
debug(fmt,args...)调试
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服