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语言
    +关注

    关注

    180

    文章

    7597

    浏览量

    136055
  • 编译
    +关注

    关注

    0

    文章

    650

    浏览量

    32794
  • Printf
    +关注

    关注

    0

    文章

    81

    浏览量

    13617
收藏 人收藏

    评论

    相关推荐

    ADC128S022断掉VA和VD的供电,VA依旧有2.2V左右的电压,为什么?

    现象描述:断掉VA 和VD的供电,VA依旧有2.2V左右的电压。(其中VD=3V,VA=3V,SPI接口电压=3.04V)) 经查发现是从SPI引脚和IN0~IN7个ADC引脚漏过来的电。(SPI
    发表于 11-15 08:25

    SV中define定义的用法

    SV中使用预处理指令`define来定义可以用来创建文本替换。根据场景不同,`define主要用来定义常量、简化复杂的表达式或代码段以及提高代码的可移植性。其基本语法为:
    的头像 发表于 10-21 14:22 234次阅读

    800VA纯正弦波逆变器的参考设计

    电子发烧友网站提供《800VA纯正弦波逆变器的参考设计.pdf》资料免费下载
    发表于 10-15 09:17 35次下载
    800<b class='flag-5'>VA</b>纯正弦波逆变器的参考设计

    如何让vasprintF运行?

    char *))user_printfHook[i])(s); } } */ os_printf(\"1\"); va_list args; os_printf(\"2
    发表于 07-09 08:17

    自建组件中LOGI出错的原因?

    \'if ( LOG_LOCAL_LEVEL >= level ) ESP_LOG_LEVEL(level, tag, format, ##__VA_ARGS__);^~~~~~~~~~~~~/home/tommy
    发表于 06-17 06:38

    printf在keil5的AC6编译器下运行进入死循环的原因?

    是: #defineLCD_UsrLog(...) do { LCD_LineColor = LCD_LOG_TEXT_COLOR; printf(__VA_ARGS__); } while (0) 向大侠们请教怎么解决?
    发表于 04-07 06:46

    STM32U575VGT6 standard request mode配置之后用不了是怎么回事?

    ( huart5, (uint8_t )ch1, sprintf((char )ch1,__VA_ARGS__)); printf_dma("DMA_RIGHTn"); 运行后hard fault error。 求助!
    发表于 03-12 06:19

    C语言中的可变参数介绍

    C 语言为这种情况提供了一个解决方案,它允许您定义一个函数,能根据具体的需求接受可变数量的参数
    发表于 02-28 14:00 273次阅读
    C语言中的<b class='flag-5'>可变</b><b class='flag-5'>参数</b>介绍

    split在python中的用法

    split在python中的用法 split()是Python中一个非常常用的字符串函数,它能够根据指定的分隔符将一个字符串分割成多个子字符串,并返回一个包含这些子字符串的列表。本文将详细介绍
    的头像 发表于 12-25 15:12 1960次阅读

    固定电阻的参数主要是 固定电阻和可变电阻的区别

    固定电阻的参数主要是 固定电阻和可变电阻的区别 固定电阻和可变电阻是电子元件中最基本的两种电阻类型之一。它们在电路中具有不同的特点和用途。本文将详细介绍固定电阻的参数,包括电阻值、功率
    的头像 发表于 12-20 10:46 802次阅读

    C语言-#和##的具体用法

    C语言中,在里面使用’#’和’##’有它非常神奇的作用。在定义的替换的过程中,#号可以作为一个预处理运算符,把参数转换为字符串。##运算符则可以把两个
    的头像 发表于 12-19 12:54 4867次阅读
    C语言-#和##的具体<b class='flag-5'>用法</b>

    pcb插针的用法

    pcb插针的用法
    的头像 发表于 12-13 16:58 1756次阅读

    如何规范和常量以及命名

    const double ASPECT_RATIO = 1.653 ; ◎ 除非必要,应尽可能使用函数代替 。 ◎ 将定义的多条表达式放在大括号中。 ◎ 使用时,不允许参数发生
    的头像 发表于 12-07 14:49 675次阅读

    oracle中substr函数用法

    字符串的源字符串,start_position是子字符串的起始位置,length是要提取的子字符串的长度(可选参数)。 下面将详细介绍SUBSTR函数的用法及示例。 基本用法 最简单的用法
    的头像 发表于 12-05 16:57 1211次阅读

    python中tuple的用法

    使用逗号进行分隔。元组在Python中具有许多有用的特性和用法,本文将详尽、详实、细致地介绍Python中元组的全部内容。 首先,元组可以用来存储多个值。与列表不同的是,元组一旦创建就不能被修改,这意味着元组的元素是不可变的。虽然元组的元素不
    的头像 发表于 11-21 16:27 906次阅读