fmt与##__VA__ARGS__

在宏定义中,fmt是一个占位符,用于表示格式字符串。fmt可以是一个字符串字面量,也可以是一个参数。

而##__VA_ARGS__是一个可变参数宏定义的特殊标记,用于表示可变数量的额外参数。##是连接符,用于将前面的内容和后面的额外参数连接起来。

举例:

#include <stdio.h>#define PRINT_MESSAGE(fmt, ...) printf(fmt, ##__VA_ARGS__)int main() {int num1 = 10;int num2 = 20;float price = 5.99;char name[] = "John";PRINT_MESSAGE("Number1: %d Number2 :%d\n", num1,num2);PRINT_MESSAGE("The price is %.2f\n", price);PRINT_MESSAGE("Name: %s\n", name);return 0;
}

关于格式化字符串:
printf 函数的第一个参数就是格式字符串。例如,上面的Number1: %d Number2 :%d\n

关于…和__VA_ARGS__

  • … 是在函数或宏的参数列表中使用,表示该函数或宏可以接受可变数量的参数。它用于声明函数或宏的参数,并将实际传递的参数列表与之匹配。注意,... 它不能在宏的展开中使用。
  • ##VA_ARGS 是在宏定义中使用的特殊标记,用于表示可变参数的展开。它用于展开可变参数,并将展开后的参数列表与其前面的内容连接起来。## 是连接符,用于在没有额外参数时确保宏定义仍然有效。

在上面的示例中,… 是宏定义中的参数,表示宏可以接受可变数量的参数(例如,fmt 后面的参数)。而 ##VA_ARGS 是宏定义中的展开语法,用于将前面的内容和可变参数展开连接起来。通过使用 ##VA_ARGS,即使没有额外的参数传递给宏,宏定义仍然有效。

利用宏进行log分级的代码展示:

#include <stdio.h>#define ERROR 1
#define INFO 2#define logLevel(Group, fmt, ...) \
do {                             \switch (Group) {              \case ERROR:              \printf("ERROR: ");   \break;               \case INFO:               \printf("INFO: ");    \break;               \default:                 \printf("unknown ");   \}                            \printf(fmt, ##__VA_ARGS__);  \
} while (0)           int main() {logLevel(ERROR, "Something went wrong.\n");logLevel(INFO, "Information message: %s\n", "Details");logLevel(3, "Something went wrong.\n");return 0;
}

打印:

ERROR: Something went wrong.
INFO: Information message: Details
unknown Something went wrong.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/200376.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信号是怎么搞到电磁波上面去的呢?

在之前的文章中&#xff0c;我们曾多次讲到电磁波的美妙&#xff0c;但是有了电磁波就可以通信了吗&#xff1f; No&#xff0c;我们要把信息加载到电磁波上&#xff0c;这个电磁波就可以作为信息的载体来工作了。可是信号是怎么加载到电磁波上的呢&#xff1f; 今天我们一起…

特征与特征图的区别

1.特征图是什么&#xff1f; 特征图是指在卷积神经网络中&#xff0c;通过卷积操作从输入图像中提取出来的图像特征。在卷积神经网络中&#xff0c;每一层的输出都是一个三维张量&#xff0c;其中第三维表示特征图的数量。每个特征图都是由若干个卷积核对上一层的特征图进行卷…

【数据结构与算法篇】八种排序 (C++实现)

多种排序算法的Cpp实现 一. 排序的概念及其运用排序的概念 二. 一图速览常见排序三. 排序的C实现1> 直接插入排序2> 希尔排序希尔排序代码实现(希尔所实现)希尔排序代码实现(优化版) 3> 选择排序选择排序的代码实现(同时选出最大和最小的元素) 4> 堆排序堆排序的代…

multipath

目录 文章目录 目录什么是multipathmultipath配置文件demo1(最小化配置)demo2demo3字段解析 命令**案例&#xff1a;查看多路径设备的信息。(常用)****案例&#xff1a;刷新multipath状态**案例&#xff1a;-v2/-v3 打印信息案例&#xff1a;查看当前活动路径的设备信息案例&am…

第17章 匿名函数

第17.1节 匿名函数的基本语法 [捕获列表](参数列表) mutable(可选) 异常属性 -> 返回类型 { // 函数体 }语法规则&#xff1a;lambda表达式可以看成是一般函数的函数名被略去&#xff0c;返回值使用了一个 -> 的形式表示。唯一与普通函数不同的是增加了“捕获列表”。 …

羊大师讲解鲜羊奶的营养价值

羊大师讲解鲜羊奶的营养价值 鲜羊奶是一种天然、营养丰富的食品&#xff0c;拥有独特的健康价值。它不仅具备高蛋白、低脂肪的特点&#xff0c;还富含各种维生素和矿物质&#xff0c;对人体健康有着卓越的贡献。今天&#xff0c;我们就来一探鲜羊奶的营养奥秘。 鲜羊奶的营养…

Data Linked UI

DataLinkedUl是一个Unity框架,它允许您在为您的应用程序创建用户界面时实现专业的数据驱动方法。使用此资产,您可以创建灵活的基于瓦片的任意大小的复杂接口系统。 核心功能: 灵活性-允许适应和调整数据变化,允许各种结构和功能配置,而不需要对现有系统进行重大破坏。 可伸…

AI封测需求强劲, AMD、英伟达等巨头将助推产业链增长 | 百能云芯

近期&#xff0c;超微&#xff08;AMD&#xff09;和英伟达&#xff08;NVIDIA&#xff09;相继发布了新一轮AI芯片&#xff0c;为封测产业链注入了新的活力。据业内人士透露&#xff0c;客户端对AI封测的需求愈发强劲&#xff0c;整体量能超过原先的估计&#xff0c;其中日月光…

我有才满足于自媒体行业的知识付费平台课程

行业资讯 实时行业热点新闻、企业动态资讯、社区热门话题&#xff0c;一榜打尽 通过图文、音频、视频、动态在内的多元媒介形式&#xff0c;致力于为企业提供多元化的资讯内容展示方式。 自定义咨询专栏&#xff0c;归类资讯内容&#xff0c;建立结构化内容体系 可以把资讯归…

循环使用接口返回的多值老大难?看我教你使用jmeter掌握72变!

有同学在用jmeter做接口测试的时候&#xff0c;经常会遇到这样一种情况&#xff1a; 就是一个接口请求返回了多个值&#xff0c;然后下一个接口想循环使用前一个接口的返回值。 这种要怎么做呢&#xff1f; 有一定基础的人&#xff0c;可能第一反应就是先提取前一个接口返回…

公有云迁移研究——AWS Route53

大纲 1 什么是Route 532 Route 53能做些什么# 3 通过DNS托管来实现分流3.1 创建DNS托管3.2 对托管创建记录对流量进行分配 4 通过流量策略来对流量进行分流4.1 创建流量策略 5 对比两者的区别6 推荐 在给客户从本地机房往AWS迁移的过程中&#xff0c;我们接到如下需求&#xff…

RPC使用JDK动态代理

介绍 在 Java 动态代理机制中 InvocationHandler 接口和 Proxy 类是核心。Proxy类中使用频率最高的方法是:newProxyInstance() &#xff0c;这个方法主要用来生成一个代理对象。 public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,Inv…

mysql中year函数有什么用

YEAR()函数用于提取日期或日期时间值中的年份。可以用于提取DATE、DATETIME或TIMESTAMP列中的年份。 SELECT YEAR(date_column) FROM table;# 提取字符串中的数据SELECT YEAR(2023-07-19) FROM table_name;

华容道问题求解第一部分_思路即方案设计

一、前言 华容道是一种传统的益智游戏&#xff0c;通常由一个长方形木板和若干个方块组成。其中包括一个或多个不同颜色的方块&#xff08;也称为车块&#xff09;和其他大小相同的方块&#xff08;也称为障碍块&#xff09;。游戏的目标是将车块从木板的一个端点移动到另一个…

Android 项目的依赖方式

四种依赖方式 在 Android 项目中&#xff0c;有多种方式可以添加项目依赖。以下是几种常见的方式&#xff1a; Gradle 依赖&#xff1a;这是最常用和推荐的方式。在项目的 build.gradle 文件中&#xff0c;你可以使用 dependencies 块来添加依赖项。Gradle 会自动从远程仓库下…

juniper EX系列交换机VLAN配置操作

配置VLAN 初始化配置时候&#xff0c;所有端口属于default VLAN&#xff0c;default vlan的默认ID是0 userhost# set interfaces name unit 0 family ethernet-switching port-mode access #配置端口的access模式&#xff0c;默认端口就是access模式。 userhost#set vlans vl…

销售工作中如何满足客户的需求?

销售工作中如何满足客户的需求&#xff1f; 在销售工作中&#xff0c;如果想要满足客户需求&#xff0c;第一步是要搞清楚客户的需求是什么&#xff0c;不能仅仅听客户的表面需求&#xff0c;在表面需求下隐藏的潜在需求是什么&#xff0c;另外还有客户的核心需求是什么&#…

举个栗子!Alteryx 技巧(8):运用批处理宏,巧妙实现分析流程重复使用

分析用户在 Alteryx Designer 做了一个比较复杂的逻辑处理&#xff0c;因为它的使用频率比较高&#xff0c;如果可以复用就能事半功倍。那么&#xff0c;如何实现多次快速使用呢&#xff1f;方法很简单&#xff1a;运用批处理宏&#xff0c;巧妙实现分析流程重复使用&#xff0…

【Tomcat】java.net.BindException “Address already in use: NET_Bind“

问题 17:37 Error running Tomcat 7.0.76: Unable to open debugger port (127.0.0.1:14255): java.net.BindException "Address already in use: NET_Bind"调整 把14255 改成 49963就正常了 附件 netstat -aon|findstr "49963" taskkill -f -pid xxx…

Linux入门笔记

1 Linux概述 Linux 是一套免费使用和自由传播的类 Unix 操作系统&#xff0c;是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。Linux 能运行主要的 UNIX 工具软件、应用程序和网络协议。它支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心…