【C】【C++】可变参数、不定参函数的使用

文章目录

  • 1. C 语言
      • 1.1 可变宏函数
      • 1.2 可变函数
  • 2. C++

1. C 语言

c语言中的可变参数写法:...

1.1 可变宏函数

  • 以日志举例,我们写入日志时只需要输入关键信息,行号文件等由宏函数补全
  • 这其中,我们需要输入的信息是格式不定的,需要用到可变参数
#include <stdio.h>#define LOG(fmt, ...) printf("[%s:%d]# "fmt, __FILE__, __LINE__, ##__VA_ARGS__);int main()
{// printf("[%s:%d]# %s, %d\n",__FILE__, __LINE__, "something error...", 666);LOG("%s %d\n","something error...", 666);LOG("%s\n","something error...");LOG("something error...\n"); // 如果只传一个fmt,没有可变参数,需要加 ##,意味着当可变参数部分没有的时候,逗号取消return 0;
}

C语言库中的宏

  1. __FILE__:字符串,记录当前文件名
  2. __LINE__:整型,记录当前行数
  3. __VA_ARGS__:可变参数

1.2 可变函数

va_list 类型,可以定义指向函数参数的指针

va_start 函数:第一个参数是指针,该函数可以让指针指向第二个参数后的第一个可变参数

va_arg 函数:第一个参数是指针,在可变参数范围中找到第二个参数所表示类型的值

va_end 函数:释放 va_list 指针

#define _GNU_SOURCE 
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>// 实现打印一定个数的一串数字
void numPrint(int cnt, ...)
{va_list p;        // 是一个指针,我们需要让他指向函数参数,用于后续打印va_start(p, cnt); // 意思是,让p指向 cnt 参数后的,第一个可变参数的位置// 将可变参数里的内容依次取出来打印for (int i = 0; i < cnt; i++){int num = va_arg(p, int); // 调用一次往后走一次,不需要手动处理printf("param[%d]: %d\n", i, num);}va_end(p); // 销毁指针
}// 实现任何格式的识别和打印
void myprintf(const char *fmt, ...)
{va_list p;va_start(p, fmt);// 有一个接口,是专门做格式解析工作的,我们这里目的是可变参数,格式解析用接口带过char *out;int ret = vasprintf(&out, fmt, p); // 把可变参数内容都以字符串形式,写入retif (ret != -1){printf(out);free(out);}va_end(p);
}int main()
{// 打印数字numPrint(5, 1, 2, 3, 4, 5);numPrint(1, 100);// 打印任意格式myprintf("%s %d %s\n", "这就是", 1, "个测试");myprintf("单参数test\n");return 0;
}

2. C++

#include <iostream>
using namespace std;// 没有可变参数的时候,不能直接用,需要模板特化一下
// 即使我们写的逻辑已经闭环了!但是模板参数他自己就是会推导到最后去!!
// 也就是说,我们在使用可变参数的时候,都要考虑一下没有可变参数的情况
void cppprintf()
{cout << endl;
}template<typename T, typename ...Args>  // 不定参的参数包类型
// void cppprintf(T &&v, Args &&...args)    // 这里 Args 是参数包的类型,...arg 是不定参数的写法,使用右值引用
void cppprintf(const T &v, Args &&...args)
{cout << v;if((sizeof ...(args)) > 0){cppprintf(forward<Args>(args)...);   // forward 完美转发,不会改变左值或者右值的类型}else{cout << endl;}
}int main()
{int a = 111;cppprintf("1个参数");cppprintf("1个参数","2个参数");cppprintf("1个参数","2个参数", a);cppprintf("1个参数","2个参数",333);  // T &v,加 const 就能过了,或者改成右值也可以return 0;
}

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

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

相关文章

实现Spring Boot集成MyBatis

引言 在Java开发中&#xff0c;Spring Boot和MyBatis是非常常用的框架。Spring Boot是一个快速开发应用程序的框架&#xff0c;而MyBatis是一个持久化框架&#xff0c;可以方便地操作数据库。本文将介绍如何使用Idea集成Spring Boot和MyBatis&#xff0c;并创建一个简单的示例…

App 出海实践:Google Play 结算系统

作者&#xff1a;业志陈 现如今&#xff0c;App 出海热度不减&#xff0c;是很多公司和个人开发者选择的一个市场方向。App 为了实现盈利&#xff0c;除了接入广告这种最常见的变现方式外&#xff0c;就是通过提供各类虚拟商品或者是会员服务来吸引用户付费了&#xff0c;此时 …

了解被测系统(二)接入链路--包括域名解析和Nginx代理

目录 一、接入链路示例 二、域名解析过程 1、相关概念 1.1、域的结构 1.2、DNS是什么&#xff1f; 1.3、DNS根域名服务器 1.4、顶级域名服务器 1.5、权威域名服务器 2、域名解析过程 2.1、检查Hosts文件 2.2、检查本地DNS缓存 2.3、DNS解析--本地DNS服务器 2.4、D…

后端SpringBoot+前端Vue前后端分离的项目(二)

前言&#xff1a;完成一个列表&#xff0c;实现表头的切换&#xff0c;字段的筛选&#xff0c;排序&#xff0c;分页功能。 目录 一、数据库表的设计 ​编辑二、后端实现 环境配置 model层 mapper层 service层 service层单元测试 controller层 三、前端实现 interface接…

IP和MAC的作用区别

在 IP 地址的上一行是 link/ether fa:16:3e:c7:79:75 brd ff:ff:ff:ff:ff:ff&#xff0c;这个被称为 MAC 地址&#xff0c;是一个网卡的物理地址&#xff0c;用十六进制&#xff0c;6 个 byte 表示。 一个网络包要从一个地方传到另一个地方&#xff0c;除了要有确定的地址&…

合宙Air724UG LuatOS-Air LVGL API控件-滑动条 (Slider)

滑动条 (Slider) 滑动条看起来和进度条是有些是有些像&#xff0c;但不同的是滑动条可以进行数值选择。 示例代码 -- 回调函数 slider_event_cb function(obj, event)if event lvgl.EVENT_VALUE_CHANGED then local val (lvgl.slider_get_value(obj) or "0")..&…

在PHP8中遍历数组-PHP8知识详解

所谓遍历数组就是把数组中的变量值读取出来。遍历数组中的所有元素对程序员来说是经常使用的操作&#xff0c;通过遍历数组可以完成数组元素的查询工作。 这好比你去商场买东西一样&#xff0c;要买什么东西&#xff0c;就去该区域浏览一遍&#xff0c;以便找出适合自己的产品…

Ubuntu 18.04安装搜狗输入法后无法显示中文

前置 Ubuntu系统&#xff1a; Ubuntu 18.04 LTS搜狗输入法版本&#xff1a; sogoupinyin_4.2.1.145_amd64.deb 搜狗输入法Linux官方安装指导&#xff1a;https://shurufa.sogou.com/linux/guide 问题 按照官方文档安装后&#xff0c;发现fcitx管理已经添加搜狗输入法&#…

【JavaEE】_CSS常用属性值

目录 1. 字体属性 1.1 设置字体家族 font-family 1.2 设置字体大小 font-size 1.3 设置字体粗细 font-weight 1.4 设置字体倾斜 font-style 2. 文本属性 2.1 设置文本颜色 color 2.2 文本对齐 text-align 2.3 文本装饰 text-decoration 2.4 文本缩进 text-indent 2.…

合宙Air724UG LuatOS-Air LVGL API控件-图片 (Image)

图片 (Image) 图片IMG是用于显示图像的基本对象类型&#xff0c;图像来源可以是文件&#xff0c;或者定义的符号。 示例代码 -- 创建图片控件 img lvgl.img_create(lvgl.scr_act(), nil) -- 设置图片显示的图像 lvgl.img_set_src(img, "/lua/luatos.png") -- 图片…

【LeetCode-面试经典150题-day20】

目录 70.爬楼梯 198.打家劫舍 139.单词拆分 322.零钱兑换 300.最长递增子序列 70.爬楼梯 题意&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 提示&#xff1a; 1 < n < …

day32 泛型 数据结构 List

一、泛型 概述 JDK1.5同时推出了两个和集合相关的特性&#xff1a;增强for循环&#xff0c;泛型 泛型可以修饰泛型类中的属性&#xff0c;方法返回值&#xff0c;方法参数&#xff0c; 构造函数的参数 Java提供的泛型类/接口 Collection, List, Set&#xff0c;Iterator 等 …

hive解决了什么问题

hive出现的原因 Hive 出现的原因主要有以下几个&#xff1a; 传统数据仓库无法处理大规模数据&#xff1a;传统的数据仓库通常采用关系型数据库作为底层存储&#xff0c;这种数据库在处理大规模数据时效率较低。MapReduce 难以使用&#xff1a;MapReduce 是一种分布式计算框架…

【Linux】进程概念I --操作系统概念与冯诺依曼体系结构

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法…感兴趣就关注我吧&#xff01;你定不会失望。 本篇导航 1. 冯诺依曼体系结构为什么这样设计? 2. 操作系统概念为什么我们需要操作系统呢?操作系统怎么进行管理? 计算机是由两部分组…

性能监控-grafana+prometheus+node_exporter

Prometheus是一个开源的系统监控和报警工具。它由SoundCloud开发并于2012年发布&#xff0c;后来成为了一个独立的开源项目&#xff0c;并得到了广泛的应用和支持。 Prometheus的主要功能包括采集和存储各种系统和应用程序的监控数据&#xff0c;并提供强大的查询语言PromQL来…

算法:数组中的最大差值---“打擂台法“

文章来源&#xff1a; https://blog.csdn.net/weixin_45630258/article/details/132737088 欢迎各位大佬指点、三连 1、题目&#xff1a; 给定一个整数数组 nums&#xff0c;找出给定数组中两个数字之间的最大差值。要求&#xff0c;第二个数字必须大于第一个数字。 2、分析特…

【数据结构】搜索树MapSet

目录 1.搜索树 1.1概念 1.2查找 1.3插入 1.4删除 2.Map 2.1map说明 2.2TreeMap和HashMap 2.3常用方法 3.Set 3.1set说明 3.2TreeSet和HashSet 3.3常用方法 1.搜索树 1.1概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者具有以下性质&…

静态工厂模式,抽象工厂模式,建造者模式

静态工厂模式 ublic class FruitFactory {public static Fruit getFruit(String name) {Fruit fnull;switch (name){case "APPLE":{fnew Apple();}case "BANANA":{fnew Banana();}default :{System.out.println("Unknown Fruit");}}return f;} …

机器学习算法系列————决策树(二)

1.什么是决策树 用于解决分类问题的一种算法。 左边是属性&#xff0c;右边是标签。 属性选择时用什么度量&#xff0c;分别是信息熵和基尼系数。 这里能够做出来特征的区分。 下图为基尼系数为例进行计算。 下面两张图是对婚姻和年收入的详细计算过程&#xff08;为GINI系…

2023.09.10 学习周报

文章目录 摘要文献阅读1-1 题目1-2 创新点1-3 本文工作2-1 题目2-2 什么是图2-3 图神经网络2-4 信息传递3-1 题目3-2 创新点3-3 本文工作 深度学习1.GNN的构建步骤2.构建图的方法3.GNN的简单样例 总结 摘要 本周阅读了三篇文章&#xff0c;第一篇是基于物理信息深度学习和激光…