【C++基础之二十】可变参数的函数
来源:互联网 发布:无间道1细节知乎 编辑:程序博客网 时间:2024/06/04 17:47
原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/17523523
C++中可变参数的函数是从C中继承而来,可变参数的函数是指函数的参数个数可变,参数类型不定的函数。我们最常见的就是printf()。
1.可变参数函数实现原理
指定参数的函数实现很简单,通过通过指定的参数名访问就行了。但是如果不指定的呢?函数的调用的参数会进行压栈处理,详细可见此文函数调用机制。而对参数的压栈是从右到左进行压栈。而参数和参数之间存放是连续的,也就是说,只要知道第一个参数的地址和类型,以及其他参数的类型,就可以获取各个参数的地址。
比如:
- int printf(const char* format, ...)
- printf("%d and % c",a,b);
2.声明和定义
可变参数函数的声明很简单,对于不定参数部分用“...”表示即可。但是实现原理可以看到,第一个的参数的地址是必须提供的,也就是可变参数必须至少包含一个参数,这个参数用来寻址,实现对所有参数的访问。所以像下面这样的声明是错误的。
- void func(...);
- void func(...,int a);
当然通常也会在对第一个参数进行一些特殊处理以方便函数的实现,比如强制指定为参数个数,或者像printf一样使用格式占位符来。
3.处理可变参数的标准宏
- //可变参数标准宏头文件
- #include "stdarg.h"
- //申明va_list数据类型变量pvar,该变量访问变长参数列表中的参数。
- va_list pvar;
- //宏va_start初始化变长参数列表。pvar是va_list型变量,记载列表中的参数信息。
- //parmN是省略号"..."前的一个参数名,va_start根据此参数,判断参数列表的起始位置。
- va_start(pvar, parmN);
- //获取变长参数列表中参数的值。pvar是va_list型变量,type为参数值的类型,也是宏va_arg返回数值的类型。
- //宏va_arg执行完毕后自动更改对象pvar,将其指向下一个参数。
- va_arg(pvar, type);
- //关闭本次对变长参数列表的访问。
- va_end(pvar);
4.可变参数函数模版
- #include <stdarg.h>
- function (parmN, ...)
- {
- va_list pvar;
- va_start (pvar, parmN);
- while(...)
- {
- ...
- f = va_arg (pvar, type);
- ...
- }
- va_end (pvar);
- }
5.示例
第一个参数指定了要计算的值的个数。
- #include "stdarg.h"
- using namespace std;
- int sum(int count, ...)
- {
- int sum_value=0;
- va_list args;
- va_start(args,count);
- while(count--)
- {
- sum_value+=va_arg(args,int);
- }
- va_end(args);
- return sum_value;
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- cout<<sum(5,1,2,3,4,5);//输出15
- }
0 0
- 【C++基础之二十】可变参数的函数
- 【C++基础之二十】可变参数的函数
- 【C语言复习(二十九)】可变参数的函数
- 可变参数的C函数
- C函数的可变参数
- C可变参数的函数
- c 可变参数 定义可变参数的函数
- c 可变参数 定义可变参数的函数
- c语言之可变参数函数
- 【java基础】函数的可变参数类型
- c可变函数参数
- C可变参数函数
- C可变参数函数
- C函数可变参数
- c 可变参数函数
- 可变参数的C函数的编写
- c/c++支持可变参数的函数
- C支持参数可变的函数
- jQuery的promise异步模式
- MySQL-5.7.10主主同步的安装和配置
- 在指定的CEF线程上执行任务
- 蓝桥杯--算法提高 我们的征途是星辰大海 (模拟)
- 利用AutoCAD I/O 和View & Data 做DWG图纸的无纸化签字
- 【C++基础之二十】可变参数的函数
- Docker Container网络模式
- oracle表空间使用率统计查询
- Leetcode Problem 1: Two sum
- 基于yarn的Hadoop调优
- Android NDK打印日志
- 使用QT实现右击菜单实例
- 怎样选择Hadoop的基准测试
- Mysql 索引重置