博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++中可变参函数的几种实现方法
阅读量:2430 次
发布时间:2019-05-10

本文共 958 字,大约阅读时间需要 3 分钟。

C++中,可变参函数列表的,用三种实现方法:

使用继承于C语言头文件<stdarg.h>中的可变参宏va_list va_start va_arg va_end进行参数扩展。

宏说明:
va_list----用于定义一个va_list类型的变量,为后面的扩展可变参列表做准备
eg: va_list pvar;
va_start—用于初始化va_list类型的变量
eg: va_start(pvar,tvar); 表示进行扩展参数,其中pvar为va_list类型的变量
tvar为离可变参(…)最近的一个固定参数
va_arg—从变参列表中获取一个参数
eg: va_arg(pvar,data_type)—data_type表示数据类型
—> int b=va_arg(pvar,int);
va_end—关闭变参扩展,进行后续的内存回收工作 eg : va_end(pvar)
使用事项:
1.在使用结束之后,一定要使用va_end进行清理工作;因为可变参的机制类似于动态开辟空间,而var_end就相当于内存回收。
2.在使用时,需要知道传递参数的类型,以及参数的个数;这就规定,在定义函数的时候至少有一个固定的形参,用于传递函数目前的变参的个数。
3.在函数的定义中,需要变长参列表在固定参之后,即:void func(int cnt,…);
4.该方法不安全,容易出现内存溢出,或是泄露的问题,而且变参列表是顺序的,不能回溯之前的参数,就相当于将变参放入了一个队列中,每执行va_arg(pvar,data_type)一次,pvar指针就往后移动一次,就往后取出一个数据
在这里插入图片描述
• 使用C++ 11标准中的initializer_list 包含在头文件<initializer_list>中
实际上就是一种容器,和vector差不多,这个使用就不要求变参列表的位置,使用方法,在这里传递的参数至少一个。

在这里插入图片描述

使用变参模板
使用该方法有着很多的优点,但是因为不能直接获得包中的参数,存在一个问题就是怎样展开参数包,而展开参数包的方法有:递归方法展开、逗号表达式展开法。这种方法可以传递0,1,2…个参数
递归方法:
使用递归方法展开,就和普通的递归函数使用类似,需要一个递归终止函数
在这里插入图片描述
在这里插入图片描述
逗号表达式展开实例:
在这里插入图片描述

转载地址:http://osjmb.baihongyu.com/

你可能感兴趣的文章
Java中的String为什么是不可变的?
查看>>
剑指offer二叉搜索树与双向链表
查看>>
LeetCode 81. 搜索旋转排序数组 II(头条)
查看>>
LC 42. 接雨水 + LC 11. 盛最多水的容器
查看>>
腾讯2017 秋招+暑期实习 笔试(编码;构造回文;字符移位;有趣的数字)
查看>>
LC 901. 股票价格跨度 LC 739. 每日温度
查看>>
【Redis深入】字典rehash图解
查看>>
java equals方法和hashCode方法
查看>>
Redis的底层数据结构(6种)
查看>>
Redis的五大数据类型实现原理
查看>>
maven依赖jar包时版本冲突的解决
查看>>
LC 446. 等差数列划分 II - 子序列
查看>>
LC 53. 最大子序和(DP)+ LC 152. 乘积最大子序列 + LC 238. 除自身以外数组的乘积
查看>>
198. 打家劫舍 DP
查看>>
628. 三个数的最大乘积
查看>>
正向代理和反向代理
查看>>
不同的类加载器加载的类不是同一个类
查看>>
Java 序列化和反序列化
查看>>
怎么让笔记本变路由器,亲身试验可用,不用下第三方软件
查看>>
DB2 SQL Error: SQLCODE=-668, SQLSTATE=57016 解决方案
查看>>