【c++里的可变参数】_c++判断命令行参数的类型_J.Kuchiki的博客-程序员秘密

技术标签: c++  

c++里的可变参数

  在c++编程中,有时我们需要编写一些在源代码编写阶段无法确定参数个数,有时甚至无法确定参数类型的函数。
  如果想通过一个同名函数实现多个参数相加的操作,我们首先会想到通过函数重载来实现,例如:

int sum(int i1, int i2);
int sum(int i1, int i2, int i3);
...//还可以重载更多类似函数

但如果参数的个数无法确定呢,我们不可能对每一种情况都进行重载。那么,需要的是这样一类函数:它们可以在运行时取任意的实参个数并根据实参的个数自动处理不同实参的情形,或者至少可以在运行时指定任意的实参个数。

可变参数列表
  C++允许定义形参个数和类型不确定的函数,不确定的形参可以使用省略号“…”。
  以sum函数为例:

int  add(int firstParam,)
使用要求:
1.省略号必须在参数列表的末尾。
2.运行时,才能确认参数的具体个数与类型。
3.只能顺序访问可变参数,无法后退访问
4.无法提供任何安全性保证

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

  1. va_list是一个列表数据类型,用于定义变量
  2. va_start(args,paramN) 令对可变函数参数的访问可行。
    args:为va_list类型的变量
    paramN:为"…"前最后一个参数
    将args初始化为指向可变参数列表第一个参数
  3. va_arg(args,type) 访问下一个可变函数参数。
    args:为va_list类型的变量
    type:是省略的形参的类型
    调用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);
	for (nArgValue = va_arg(arg_ptr, int); nArgValue != 0;)
	{
    
		sum = sum + nArgValue;
		nArgValue = va_arg(arg_ptr, int);
	}
	va_end(arg_ptr);
	return sum;
}

int main()
{
    
	cout << add(1, 2, 3, 0) << endl;       //运行结果:6
	system("pause");
}

输出结果为:6。
参考:https://blog.csdn.net/qq_41601836/article/details/105753504

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43899283/article/details/124349972

智能推荐

为什么大部分的程序员成不了架构师?为什么?_互联网架构的博客-程序员秘密

小团队一般 10 人左右,其中常常是技术最牛的人做架构师(或TL)。所以,架构师在广大码农中的占比大概平均不到 10%。而架构师也可以分为初级、中级、高级三档,江湖上真正...

常见排序算法总结_xiao_nian的博客-程序员秘密

一、概述          我们在平时的开发中,排序算法可以说是最常用的算法之一,不同的排序算法,有着不一样的性能消耗,虽说前端开发对算法的要求没有那么高,但是对于一些常见的算法,我们还是要掌握的,它属于一个开发者的基本功,今天,我们就来总结一下常见的排序算法,请看下面这张表:下面排序都以由小到大排序为目的 二、冒泡排序1、基本思想:两个数比较大小,较大的往下沉,较小的冒上来...

字符串的展开(字符串处理)_字符串展开_背着代码的蜗牛的博客-程序员秘密

字符串的展开来源: NOIP 2007 提高第二题 题目描述: 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简写,输出时,用连续递增的字母获数字串替代其中的减号,即,将上面两个子串分别输出为“defgh”和“45678”。在本题中,我们通过增加一些参数的设置,使字符串的展开更为灵活。

java hmac digest_JAVA加密算法(2)- 消息摘要算法(MD5、SHA、HMAC)_SanSiro等100万人的博客-程序员秘密

消息摘要的概念对消息通过一个单向Hash算法进行计算,得到一个唯一的结果。每个消息对应一个唯一结果,所有结果的长度固定。消息摘要的分类(1)MD5(Message Digest)消息摘要算法(2)SHA(Secure Hash Algorithm)安全散列算法(3)MAC(Message Authentication Code)消息认证码算法,结合了MD5和SHA的优势,同时用密钥对摘要进行加密,...

docker 变量_具有组成变量替换功能的Docker桥和覆盖网络_danpob13624的博客-程序员秘密

docker 变量 Docker多主机联网允许您创建虚拟网络并将容器连接到它们,从而可以创建适合您的应用程序的网络拓扑。 可以为单个主机创建桥接网络,可以为多个主机创建覆盖网络。 创建特定于应用程序的网络可为容器提供完全隔离。 Docker Compose文件可以针对单个主机,并且--x-networking将创建该应用程序专有的桥接网络。 如果示例应用程序针对多个主机(例如使用Docke...

java连接数据库的工具类_java数据库连接工具类_断翅蝴蝶非的博客-程序员秘密

声明以下代码并非本人所写,也不是转载。只是参与项目中,总结出来的而已。public class DBHelper { private final static Log log = LogFactory.getLog(DBHelper.class.getClass()); //获得properties文件的各个参数 private static String driver =

随便推点

2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)_aisebu7819的博客-程序员秘密

摘要  本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛。HDU 5984 Pocky 题意  给出一根棒子(可以吃的)的长度x和切割过程中不能小于的长度d,每次随机的选取一个位置切开,吃掉左边的一半,对右边的棒子同样操作,直至剩余...

kaggle上传慢_Kaggle使用:如何顺利上传和下载数据?_weixin_39860583的博客-程序员秘密

自从Kaggle被谷歌收购后,Kaggle上的数据下载和kernel使用到了很多的谷歌应用。与参赛选手强相关的是比赛数据集下载和文件的上传。如何顺利的上传和下载数据呢,本文将给出三种解决方案。修改DNS由于国内运营商网络管控的原因,导致国内访问国外的速度都非常慢,所以在下载Kaggle数据集时可以尝试修改系统DNS。这里比较推荐以下几个DNS:谷歌:8.8.8.8,8.8.4.4韩国:1...

python oss上获取指定bucket,指定时间范围内文件_persistencequxi的博客-程序员秘密

# -*- coding: utf-8 -*-import sysimport oss2import timeimport tracebackPREFIX = 'http://'class find_oss_file(): def __init__(self): pass # ossinfo { # ossinfo ={ACCESS_KEY_ID,ACCESS

java 类的对象比较大小以及排序实现方式_灵颖桥人的博客-程序员秘密

java中类的对象比较大小进行排序,不像C++那样可以重载运算符比较大小,java中需要实现特定的接口或者自己给类加上逻辑大小比较函数,个人认为有以下三种方式吧:一、类实现java.util.Comparator&amp;lt;T&amp;gt;接口Comparator中有个接口,如下: int compare(T o1, T o2);比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数...

推荐文章

热门文章

相关标签