历史上的今天
返回首页

历史上的今天

今天是:2025年01月26日(星期日)

2021年01月26日 | 可变参数宏__VA_ARGS__的用法

2021-01-26 来源:eefocus

图片回顾图片

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

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

__LINE__:正在编译文件的行号

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

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


代码:

char BuildFile[] = __FILE__;

int  BuildLine = __LINE__;

char BuildDate[] = __DATE__;

char BuildTime[] = __TIME__;

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

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

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

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


提示:__LINE__是整型数据;


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

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

char const* BuildFunName = __FUNCTION__;

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


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

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

图片


代码:

int  IDEVersion = __VER__;

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


输出:

IDE版本:7080004


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


Ⅰ本文要点--可变参数

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

char a = 1;

char b = 2;

char c = 3;

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

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

printf("a = %d; b = %d; c = %dn", 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.实例说明

#define SENSOR_Printf(...)  printf("--SENSOR--"__VA_ARGS__)

int TemperatureVal = 25;

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


输出结果:

--SENSOR--温度 = 25℃


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


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

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


推荐阅读

史海拾趣

e2v technologies公司的发展小趣事

e2v Technologies自成立以来,一直致力于技术创新和科学合作。公司曾与多个国际知名科研机构合作,参与了诸如哈勃天文望远镜、Envisat气象环境遥感卫星等著名科学项目。这些项目对图像传感器的精度和稳定性提出了极高的要求,e2v凭借其卓越的技术实力,成功为这些项目提供了高质量的图像传感器,进一步巩固了其在图像传感器领域的领先地位。

AAEON公司的发展小趣事

在医疗领域,e2v也积极发挥其作用。公司针对放射治疗系统提供了价格合理、易于运输和安装的国内制造设备,支持中国各地医院和诊所的放射治疗工作。这些设备不仅提高了放射治疗的效果和效率,也为患者带来了更好的治疗体验。

Anvo-Systems公司的发展小趣事

Anvo-Systems深知人才是企业发展的核心动力。因此,公司一直注重与高校和研究机构的合作,共同开展电子技术的研发与创新。通过与高校合作开展科研项目、设立奖学金等方式,Anvo-Systems吸引了大批优秀的人才加入公司。同时,公司还建立了完善的培训体系,为员工的职业发展提供了有力支持。这些举措不仅提升了公司的研发实力,也为公司的未来发展储备了丰富的人才资源。

Amkor公司的发展小趣事

Anvo-Systems在发展过程中始终注重企业文化建设和社会责任履行。公司倡导创新、协作、诚信的企业精神,为员工创造了一个积极向上的工作环境。同时,Anvo-Systems还积极参与社会公益活动,关注环保和可持续发展等问题。通过这些举措,Anvo-Systems不仅提升了企业的社会形象,也为社会的和谐发展做出了积极贡献。


请注意,以上故事纯属虚构,不代表现实中任何公司或行业的真实情况。在实际应用中,应根据具体公司的历史和发展情况进行调整和完善。

Heraeus公司的发展小趣事

随着公司业务的不断扩展,Anvo-Systems开始实施国际化战略。公司先后在亚洲、欧洲和北美等地设立了研发中心和生产基地,以更好地满足不同地区的市场需求。同时,Anvo-Systems积极参与国际电子展会和技术交流活动,与全球同行建立了广泛的合作关系。这一全球化布局不仅提升了公司的竞争力,也为公司的长期发展打开了新的空间。

Aavid Niagra公司的发展小趣事

Aavid Niagra公司在成立之初,面临着资金短缺、市场竞争激烈以及技术壁垒等多重挑战。然而,创始人凭借对电子散热技术的深刻理解和前瞻性的市场洞察,成功研发出了一款高效能的散热解决方案,赢得了行业内的初步认可。通过与几家大型电子设备制造商的合作,公司逐渐在市场上站稳脚跟,为后续的发展奠定了坚实基础。

问答坊 | AI 解惑

开关电源EMI滤波器的正确选择与使用

1 插入损耗和滤波电路的选择  在用户选择滤波器时,最关心插入损耗性能。但是,往往插入损耗相近的滤波器,在实际运用中效果相差甚远。究其主要原因是,相近插入损耗的滤波器可由不同的电路实现。这和理论分析是吻合的,因为插入损耗本身是个多 ...…

查看全部问答>

再晒 模拟现场应用

这个图就是模拟现场实际应用的了,只不过现场要把这些设备统一安装到一个控制柜内而已。还算整洁吧!咔咔!…

查看全部问答>

LPC2200与外接flash寻址问题

由于数据总线宽度设置为 16 位。因此应将LPC2200 外部存储器的引脚地址输出线[A1~A20]与 SST39VF160 芯片的[A0~A19]连接,其 物理地址访问范围为:0x80000000—0x801FFFFF。 在资料上看到这句话,还是没搞清为什么寻址16位就要LPC2200的A0不连 ...…

查看全部问答>

新一代液晶開發技術

DWIN推出新一代人机界面 迪文科技深圳办事处 张本信 0755-83013365  15914114014 dwin2008@126.com 为了实现快速开发人机界面产品,迪文科技(DWIN)推出新一代液晶控制器,内嵌高速图形处理芯片和大容量FLASH存储器,用户只需外 ...…

查看全部问答>

Vmware中搭建VxWorks环境失败, 估计是下载的AMD PC NET网卡驱动有问题?

Vmware中搭建VxWorks环境失败, 估计是下载的AMD PC NET网卡驱动有问题: 从AMD网站上下载的驱动vxworks_end.exe,2次解压后得:License.txt ln97xEnd.tar vx.doc, 装好WINDRIVER.TORNADO.V2.2.FOR.PENTIUM.CD1.ISO,WINDRIVER.TORNADO.V2.2.FOR.PENTI ...…

查看全部问答>

帮忙完成一个简单的需求分析

    我需要开发一个支持XML的编辑器,需要实现:数据保存为XML格式 能进行基本的数据操作(添加,删除,查看,修改),能让PDA和pc机保持数据同步,开发语言为c#.net,操作系统为wince5.0.现在是需要向开发板厂家提要求,我不知道开发这样的小软件,在 ...…

查看全部问答>

各位高手怎么查看局部变量的值吗?

在IAR中..经常停在一个函数内部.可它的局部变量和形参不论是拉到Watch中还是直接点出Locals.状态都是unavailable但有时候又能够看到值.. 我就很郁闷了..今天反复试验了一下..发现当使用None优化等级时就可以看到各个局部变量的值.而采用M ...…

查看全部问答>