c++里的可变参数

2023-05-16

 C++允许定义形参个数和类型不确定的函数,不确定的形参可以使用省略号“…”

int  add(int firstParam,  … )

使用要求:

  • 省略号必须在参数列表的末尾。
  • 运行时,才能确认参数的具体个数与类型。
  • 只能顺序访问可变参数,无法后退访问
  • 无法提供任何安全性保证

如果使用省略号,传递可变数量的参数时使用va_arg、va_start、va_end 和 va_list等宏,定义在<cstdarg>中(c中定义在<stdarg.h>)。

(1)va_list是一个列表数据类型,用于定义变量

(2)va_start(args,paramN) 令对可变函数参数的访问可行。

  • 第一个参数为va_list类型的变量
  • 第二个参数为"..."前最后一个参数
  • 将args初始化为指向可变参数列表第一个参数

(3)va_arg(args,type)  访问下一个可变函数参数。

  • 第一个参数为va_list类型的变量
  • 第二个参数是省略的形参的类型
  • 调用va_arg可以返回传入的实参,并自动更新指向下一个可变参数

(4)va_end(args)  结束可变参数函数的遍历。

  • 释放va_arg变量
#include<iostream>
#include<cstdarg>
using namespace std;
 
//求和函数
int add(int firstParam, ...)
{
	va_list arg_ptr;
	int sum = 0;
	int nArgValue;
	sum += firstParam;
	va_start(arg_ptr, firstParam);
	do
	{
		nArgValue = va_arg(arg_ptr, int);
		sum += nArgValue;
	} while (nArgValue != 0);
	va_end(arg_ptr);
	return sum;
}
 
int main()
{
	cout << add(1, 2, 3, 0) << endl;       //运行结果:6
	system("pause");
}

 

######################################

Variadic 宏是参数个数可变的宏,省略号可以被指定为正式自变量,并且替换标识符 __VA_ARGS__

#include<stdio.h>
#include<stdarg.h>
#define LOGSTRINGS(fm,...) printf(fm,__VA_ARGS__)
int main()
{
	LOGSTRINGS("hello,%d",10);              //输出:hello,10
	return 0;
}

 

转载链接:

https://www.baidu.com/link?url=a_IIy88T7_TpbrnsgL_0wZVFFgFgZVCRkM6idJIAozVkymH5cv2cUzmBNBuC3BQVCvqHBY25gnY7Ahu6UVTVPkuM54sosMPTX3namcHeNdO&wd=&eqid=d0b1dc650000b699000000065ea4048c

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++里的可变参数 的相关文章

  • manjaro的安装与配置

    关于manjaro一些配置的文章推荐 manjaro详细安装过程请看这里 https blog csdn net luo3300612 article details 83281029 I3窗口管理器的配置请看这里 https www cn
  • 谷歌浏览器如何打开标签时不覆盖原标签

    1 中键 鼠标滑轮 点击链接 2 Ctrl 43 左键单击 3 鼠标指针移至标签右击 xff0c 选择在新标签页中打开 转载地址 https www baidu com link url 61 UJZqjGzit7S3FRoiTmbLeJq
  • Vbox安装manjaro 增强功能 无法加载 无法全屏 分辨率 (已解决)

    linux操作系统具有天生的优势 今天被推荐看中了manjaro发行版 于是乎在Vbox里安装试了一下 中间填了的坑在下 1 Vbox窗口太小 操作系统无法全屏 这个问题百度了下 主要是安装增强功能 win版Vbox的安装目录里有一个叫做V
  • vmware安装deepin系统一直卡在黑屏(已解决)

    我与到了这样的情况 在vmware里安装的deepin15 一致卡在黑屏界面 解决办法如下 deepin属于dedian系的系统 在vmware选择系统类型的时候 选择同属于debian系的ubantu就行了 还要注意待安装的系统是32还是
  • arch linux设置网络

    转载地址 https www baidu com link url 61 ItEG8p9JBhXBaRapfZwvJHqvLviMk7 xfiQRuPA5eqeE5l8y BOc48YHjeL1pvfyHxl8C5KyEgvMzZZvpJW
  • 第一次配置Arch经历的的步骤

    在安装基本操作系统之前 我们处于arch安装引导的环境里 而不是arch里 本篇采用efi 43 gpt启动 在安装之前先查看自己的电脑是否支持efi模式 怎么查看详情转这个链接 目录 在安装基本操作系统之前 我们处于arch安装引导的环境
  • FL Studio21中文版本下载及语言切换调整

    FL Studio21是一个很好的音乐制作软件 此外 xff0c 如果你使用接口软件制作音乐 xff0c 这是非常简单和有效的使用 这将有助于你的工作变得井井有条 此外 xff0c 它还将为您提供一个集成的开发环境 而且 xff0c 这个软
  • Vim的三种模式以及基本操作

    基本上 vi vim 共分为三种模式 xff0c 分别是命令模式 xff08 Command mode xff09 xff0c 输入模式 xff08 Insert mode xff09 和底线命令模式 xff08 Last line mod
  • java的内部类的理解之一

    A类不能在A类里面创建对象 如果A是B的内部类 则A类可以在A的外部 B的内部创建对象 目录 一 内部类基础 1 成员内部类 2 局部内部类 3 匿名内部类 4 静态内部类 二 深入理解内部类 1 为什么成员内部类可以无条件访问外部类的成员
  • python内部类的理解

    案例一 class parent def init self self name 61 34 parent 34 def getName self print self name class child def init self self
  • java内部类的理解之二

    内部类Inner Class 将相关的类组织在一起 xff0c 从而降低了命名空间的混乱 一个内部类可以定义在另一个类里 xff0c 可以定义在函数里 xff0c 甚至可以作为一个表达式的一部分 Java中的内部类共分为四种 xff1a 静
  • java内部类的理解之四

    内部类是指在一个外部类的内部再定义一个类 类名不需要和文件夹相同 内部类可以是静态static的 xff0c 也可用public xff0c default xff0c protected和private修饰 xff08 而外部顶级类即类名
  • java内部类的理解之三

    java中的内部类总结 内部类不是很好理解 xff0c 但说白了其实也就是一个类中还包含着另外一个类 如同一个人是由大脑 肢体 器官等身体结果组成 xff0c 而内部类相当于其中的某个器官之一 xff0c 例如心脏 xff1a 它也有自己的
  • c++语言基础知识总结

    目录 一 程序书写tips 二 multi sources处理 三 关键字 四 输入流和输出流 1 输出 2 输入 五 数据类型 1 简单数据类型 1 常量 2 转义字符 2 容器数据类型 1 枚举 2 字符串 3 数组 4 指针 5 引用
  • 一些有用的在线帮助文档(微软,C/C++,Java,linux)

    linux 系统调用和 函数库 你点2 和 3 http www kernel org doc man pages 微软全家桶的帮助Doc http msdn microsoft com en us library ms123401 asp
  • C语言基础知识总结

    目录 一 程序书写tips 二 multi sources处理 请看这篇文章 三 关键字 四 输入流和输出流 1 输出 2 输入 五 数据类型 1 简单数据类型 2 容器数据类型 1 数组 2 字符串 2 枚举 3 指针 3 结构体 4 位
  • 彻底解决VS的4996警告

    方法一 xff1a 使用安全的函数替换老的函数 方法二 xff1a 屏蔽警告信息 1 在文件最前面加上 pragma warning disable 4996 2 在头文件里定义下面的宏 xff1a define CRT SECURE NO
  • easyrecovery免费版2023最新电脑数据恢复软件

    通常 xff0c 许多人会将工作或生活中的数据存储在我们的计算机上 很多时候 xff0c 由于我们的误操作或其他一些问题 xff0c 很容易错误地删除一些文件和数据 特别是 xff0c 一些计算机故障总是会导致数据丢失 xff0c 这是非常
  • C语言fread和fwrite

    对文件格式化读写函数 fprintf 与 fscanf 而言 xff0c 尽管它可以从磁盘文件中读写任何类型的文件 xff0c 即读写的文件类型可以是文本文件 二进制文件 xff0c 也可以是其他形式的文件 但是 xff0c 对二进制文件的

随机推荐

  • C语言文件定位函数rewind和fseek

    文件定位函数rewind和fseek 移动文件内部位置指针的函数主要有两个 xff0c 即 rewind 和 fseek rewind 用来将位置指针移动到文件开头 xff0c 前面已经多次使用过 xff0c 它的原型为 xff1a voi
  • 文件中的EOF是什么

    1 EOF 定义在 usr include stdio h 文件中 xff1a 从上面 EOF 的定义我们可以看出 EOF 本质上就是一个值为 1的常量 xff01 2 在Linux系统之中 xff0c EOF根本不是一个字符 xff0c
  • C语言命令行参数

    argc 是指传入参数的个数 xff0c argv 是一个指针数组 xff0c 指向传递给程序的每个参数 include lt stdio h gt int main int argc char argv if argc 61 61 2 p
  • C/C++程序的内存分配

    一个由C C 43 43 编译的程序占用的内存分为以下几个部分 1 栈区 xff08 stack xff09 由编译器自动分配释放 xff0c 存放函数的参数值 xff0c 局部变量的值等 其操作方式类似于数据结构中的栈 2 堆区 xff0
  • c++的struct和class区别

    在C 43 43 中我们可以看到struct和class的区别并不是很大 xff0c 两者之间有很大的相似性 那么为什么还要保留struct 这是因为C 43 43 是向下兼容的 xff0c 因此C 43 43 中保留了很多C的东西 一 首
  • c++中的构造函数

    子类不会继承父类的构造方法 子类创建对象时 先执行父类无参的构造方法 然后执行子类的构造方法 如果父类只有有参数的构造方法 xff0c 则子类必须显示调用此带参构造方法 继承构造函数不会继承参数的默认值 struct A A int i A
  • c++构造函数详解

    一 构造函数的种类 1 无参数构造函数 如果创建一个类你没有写任何构造函数 则系统会自动生成默认的无参构造函数 xff0c 函数为空 xff0c 什么都不做只要你写了一个某一种构造函数 xff0c 系统就不会再自动生成这样一个默认的构造函数
  • c++的using关键字

    用法一 xff1a using namespace 命名空间 该用法能直接在程序中使用using后所跟的命名空间的元素 xff0c 而不用每次要使用时指定命名空间 using namespace std 这样就可以直接用std命名空间里的元
  • namespace名字空间

    一 为什么使用命名空间 考虑一种情况 xff0c 当我们有两个同名的人 xff0c Zara xff0c 在同一个班里 当我们需要对它们进行区分我们必须使用一些额外的信息和它们的名字 xff0c 比如这个区域 xff0c 如果它们生活在不同
  • cleanmymac在哪下载?中文官网安装教程

    CleanMyMac是一个系统清理工具 xff0c 删除系统缓存文件 多余的应用程序语言包 PowerPc软件运行库等 是个给你的硬盘瘦身的好工具 系统 xff1a macOS 10 14 xff08 在10 15以及Big Sur中的安装
  • c++中virtual的用法

    1 虚函数的用法 用于子类重写父类函数 父类 class base 子类 class sub public base 主函数 main 指针p的指向静态绑定为base 想要解除静态绑定 需要把base中的函数用virtual修饰 base
  • c++抽象类

    如果类中有函数被声明为纯虚函数 xff0c 则这个类就是抽象类纯虚函数是通过在声明中使用 34 61 0 34 来指定的 xff0c 如下所示抽象类不能被实例化对象 xff0c 由它派生的子类实现 class Box public 纯虚函数
  • C++中的文件操作

    需要用到 C 43 43 中另一个标准库 fstream 数据类型描述ofstream该数据类型表示输出文件流 xff0c 用于创建文件并向文件写入信息 ifstream该数据类型表示输入文件流 xff0c 用于从文件读取信息 fstrea
  • c++中的匿名对象

    匿名对象只存在于构造该对象的那行代码 xff0c 离开构造匿名对象的哪行代码后立即调用析构函数 class Some int n public Some int s n 61 s Some cout lt lt 34 destroy n 3
  • c++中的匿名对象

    匿名对象只存在于构造该对象的那行代码 xff0c 离开构造匿名对象的哪行代码后立即调用析构函数 class Some int n public Some int s n 61 s Some cout lt lt 34 destroy n 3
  • c++中的异常处理

    C 43 43 异常处理涉及到三个关键字 xff1a try try 块中的代码标识将被激活的特定异常 并由throw跳出try块 它后面通常跟着一个或多个 catch 块 throw 在try的函数体内放置throw语句 通常后接字符串
  • c++的泛型编程及模板

    一 模板函数 2 用模板定义函数 template lt typename T0 typename T1 typename T2 gt T0 print T1 arg1 T2 arg2 arg1和arg2是两个形参 cout lt lt a
  • c++与时间相关的函数和信号处理

    1 Sleep 函数 Linux 用 include lt unistd h gt 和 sleep xff0c Windos 用 include lt windows h gt 和 Sleep Sleep 括号里的时间 xff0c 在 Wi
  • c++的explicit和implicit修饰符

    explicit修饰符代表显式 implicit修饰符代表隐式 类构造函数默认是隐式implicit的 在隐式情况下 类构造函数会发生隐式转换 即以下两种写法是相互转换的 CxString string2 61 10 CxString st
  • c++里的可变参数

    C 43 43 允许定义形参个数和类型不确定的函数 xff0c 不确定的形参可以使用省略号 int add int firstParam 使用要求 xff1a 省略号必须在参数列表的末尾 运行时 xff0c 才能确认参数的具体个数与类型 只