0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

可变参数的宏__ VA_ARGS__的用法

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-20 09:26 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

回顾

在【ANSIC几种特殊的标准定义】中我们讲述了比较常用的几项:

__FILE__:正在编译文件的路径及文件名

__LINE__:正在编译文件的行号

__DATE__:编译时刻的日期字符串 如“Jun 17 2017”

__TIME__:编译时刻的时间字符串 如”1000“

代码:

char BuildFile[] = __FILE__;

int BuildLine = __LINE__;

char BuildDate[] = __DATE__;

char BuildTime[] = __TIME__;

printf("编译文件路径:%s ", BuildFile);

printf("编译代码所在行:%d ", TestLine);

printf("编译日期:%s ", BuildDate);

printf("编译时间:%s ", BuildTime);

提示:__LINE__是整型数据;

其实除了这些还有很多相关的定义,比如:

1.__FUNCTION__:函数名,类型为:字符常量指针。

char const* BuildFunName = __FUNCTION__;

printf("函数名称为:%s ", BuildFunName);

2.__VER__:IDE版本信息,类型为:整型。

如我用的IAR版本为:7.80.04,如下图:

代码:

intIDEVersion = __VER__;

printf("IDE版本:%d ", IDEVersion);

输出:

IDE版本:7080004

更多相关内容,可以自己学会着摸索。而本文讲的内容也是和打印相关,一般都会结合到上面内容一起来使用,详情请看下文。

Ⅰ本文要点--可变参数

我们在学习C语言的时候,都知道printf是可变参数的函数:

char a = 1;

char b = 2;

char c = 3;

printf("a = %d ", a);

printf("a = %d; b = %d ", a, b);

printf("a = %d; b = %d; c = %d ", a, b, c);

上面就是可变参数printf的例子,也就是说参数可以一个也可以多个。而本文说的__VA_ARGS__,就是一个可变参数宏,与printf中可变参数的宏定义一个道理,是新C99规范中增加的。

Ⅱ__VA_ARGS__详情内容

1.关于__VA_ARGS__

__VA_ARGS__它是一个可变参数的宏,就是将左边宏中“...” 的内容原样抄写在右边 __VA_ARGS__ 所在的位置。

要注意的是,printf 的输出格式是括号内左边是字符串,右边是变量,而且右变量与左输出格式是一一对应的,不对应就会出错。可以参看下面那个例子, __VA_ARGS__其实是遵循了printf的格式。

...缺省号代表一个可以变化的参数表。使用保留名 __VA_ARGS__ 把参数传递给宏。当宏的调用展开时,实际的参数就传递给 printf()了。

2.实例说明

#defineSENSOR_Printf(...) printf("--SENSOR--"__VA_ARGS__)

intTemperatureVal = 25;

SENSOR_Printf("温度 = %d℃ ", TemperatureVal);

输出结果:

--SENSOR--温度 = 25℃

用心的朋友可能会猜测的到:“...”类似等于“__VA_ARGS__”。

从例子中我们可以看得出来,__VA_ARGS__的用途,主要是用于可变参数的函数。我们使用较多的printf就是最常见的一个。

如果我们的工程很庞大,我们就可以将打印信息分类,这样的好处就是方便我们识别各类打印信息。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    183

    文章

    7642

    浏览量

    144558
  • 编译
    +关注

    关注

    0

    文章

    687

    浏览量

    34935
  • Printf
    +关注

    关注

    0

    文章

    84

    浏览量

    14625
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【瑞萨RA6E2】板载uart测试,控制台shell及带颜色输出log的实现

    , ##__VA_ARGS__) /** * @brief 警告log输出 * * @param fmt 格式 * @param ... 参数 */ #define logWarning(fmt
    发表于 11-09 23:50

    FlashDb在F103上使用报错的原因?

    extern void rt_kprintf(const char *fmt, ...); #define FDB_PRINT(...) rt_kprintf(__VA_ARGS__
    发表于 09-29 07:46

    1710-1950 MHz 可变增益放大器 skyworksinc

    电子发烧友网为你提供()1710-1950 MHz 可变增益放大器相关产品参数、数据手册,更有1710-1950 MHz 可变增益放大器的引脚图、接线图、封装手册、中文资料、英文资料
    发表于 09-26 18:31
    1710-1950 MHz <b class='flag-5'>可变</b>增益放大器 skyworksinc

    695 至 866 MHz 可变增益放大器 skyworksinc

    电子发烧友网为你提供()695 至 866 MHz 可变增益放大器相关产品参数、数据手册,更有695 至 866 MHz 可变增益放大器的引脚图、接线图、封装手册、中文资料、英文资料,695 至
    发表于 09-22 18:32
    695 至 866 MHz <b class='flag-5'>可变</b>增益放大器 skyworksinc

    2110-2170 MHz 可变增益放大器 skyworksinc

    电子发烧友网为你提供()2110-2170 MHz 可变增益放大器相关产品参数、数据手册,更有2110-2170 MHz 可变增益放大器的引脚图、接线图、封装手册、中文资料、英文资料
    发表于 09-22 18:32
    2110-2170 MHz <b class='flag-5'>可变</b>增益放大器 skyworksinc

    2620-2690 MHz 可变增益放大器 skyworksinc

    电子发烧友网为你提供()2620-2690 MHz 可变增益放大器相关产品参数、数据手册,更有2620-2690 MHz 可变增益放大器的引脚图、接线图、封装手册、中文资料、英文资料
    发表于 09-22 18:31
    2620-2690 MHz <b class='flag-5'>可变</b>增益放大器 skyworksinc

    791 至 821 MHz 可变增益放大器 skyworksinc

    电子发烧友网为你提供()791 至 821 MHz 可变增益放大器相关产品参数、数据手册,更有791 至 821 MHz 可变增益放大器的引脚图、接线图、封装手册、中文资料、英文资料,791 至
    发表于 09-22 18:30
    791 至 821 MHz <b class='flag-5'>可变</b>增益放大器 skyworksinc

    2000-2230 MHz 可变增益放大器 skyworksinc

    电子发烧友网为你提供()2000-2230 MHz 可变增益放大器相关产品参数、数据手册,更有2000-2230 MHz 可变增益放大器的引脚图、接线图、封装手册、中文资料、英文资料
    发表于 09-19 18:33
    2000-2230 MHz <b class='flag-5'>可变</b>增益放大器 skyworksinc

    【RA-Eco-RA6M4开发板评测】SEGGER_RTT打印日志

    SEGGER_INDEX(0) #define APP_PRINT(fn_, ...)(SEGGER_RTT_printf (SEGGER_INDEX,(fn_), ##__VA_ARGS__)) #define
    发表于 07-31 14:40

    VA One 2024版本的关键升级

    自 2005 年发布以来,VA One 已广泛应用于汽车、航空航天、船舶等多个行业领域。VA One 开发团队每年都会对软件进行功能迭代与优化,目前最新版本为 VA One 2024。与以往版本
    的头像 发表于 07-14 16:09 1069次阅读
    <b class='flag-5'>VA</b> One 2024版本的关键升级

    TechWiz LCD 1D应用:单畴VA显示模式

    VA模式是液晶显示器常见的几种显示模式之一,其特点是液晶分子垂直配向,这种面板对比度比较好,价格也比较便宜,通常用在电视上,接下来我们就来模拟一下简单的单畴VA结构 1. 堆栈结构 堆栈层及层信息
    发表于 04-28 10:06

    TechWiz LCD 1D应用:单畴VA显示模式

    VA模式是液晶显示器常见的几种显示模式之一,其特点是液晶分子垂直配向,这种面板对比度比较好,价格也比较便宜,通常用在电视上,接下来我们就来模拟一下简单的单畴VA结构 1. 堆栈结构 堆栈层及层信息
    发表于 04-01 09:33

    TechWiz LCD 1D应用:单畴VA显示模式

    VA模式是液晶显示器常见的几种显示模式之一,其特点是液晶分子垂直配向,这种面板对比度比较好,价格也比较便宜,通常用在电视上,接下来我们就来模拟一下简单的单畴VA结构 1. 堆栈结构 堆栈层及层信息
    发表于 03-28 08:57

    移植vi-&gt;venc时提示VA and PA must be page aligned. va=0x70000000, pa=0x10823300,是什么问题?

    移植vi-&gt;venc时出现以下提示 VA and PA must be page aligned. va=0x70000000, pa=0x10823300 编译时正常的,在
    发表于 02-08 07:18

    Techwiz LCD 1D VA显示模拟建模

    倾角:89.5° 方位角:45° 液晶参数:Δε=-4.2Δn=0.08 光源:λ=380-780nm 偏光片:上0°,下 90° 器件结构(VA型) 结果 不同视角下对比度 色域图 RGB子像素的真实颜色轮廓
    发表于 01-13 08:52