C语言-11-可变参数的实现方案
2016-02-19 12:21
363 查看
概述
某种情况下,我们可能需要一个具有可变参数的函数,C语言提供了一种标准的实现可变参数的方法C语言实现可变参数的方案是基于标准库的
可变参数的类型
可变参数可以放在一个集合中,可以使用指针类型的参数或引用类型的参数来实现可变参数
可变参数不可以放到一个集合中,可以使用C语言提供的标准方案来实现可变参数
标准库 stdarg.h
stdarg.h中定义的内容一个类型
va_list,用来定义存放参数列表
三个宏(用于获取参数个数未知的函数中的参数)
void va_start(va_list ap, last_arg)
通常与 va_arg 和 va_end 配合使用,且必须在 va_arg 和 va_end 之前被调用
va_start 初始化 ap 变量(为 ap 变量分配内从空间),last_arg 为传递给函数的已知的固定参数列表中的最后一个。
ap变量用来存储通过 va_arg 获取额外参数时所必需的信息
type va_arg(va_list ap, type)
检索函数参数列表中类型为 type 的下一个参数
void va_end(va_list ap)
允许使用了 va_start 宏 的 带有可变参数的函数 返回,若函数返回之前没有调用 va_end,则函数返回的结果是未定义的
实现方案
形式实现可变参数的函数的参数列表通常包括以下两部分
固定参数列表,通常包含可变参数的总个数信息(通常为固定参数列表中的最后一个参数,即省略号'...'前的那个参数)
可变参数列表,使用省略号'...'表示
步骤
定义一个函数,最后一个参数为省略号'...',且省略号前的那个参数总是int类型,表示参数的总个数
在函数定义中创建 va_list 类型变量,用来存储通过 va_arg 获取额外参数时所必需的信息
使用 int 参数和 va_start 宏来初始化 va_list 变量为一个参数列表
使用 va_arg 宏和 va_list 变量来访问参数列表中的每个项
使用宏 va_end 来清理赋予 va_list 变量的内存
示例
// 计算可变数量个参数的和 int sum(int num, ...) { // 定义va_list类型变量 va_list valist; int i; double sum = 0.0; // 初始化valist va_start(valist, num); // 获取参数列表中的每个项 for (i = 0; i < num; i++) { sum += va_arg(valist, int); } // valist变量的内存 va_end(valist); return sum; } // 实现可变参数的函数的使用示例 int main(int argc, const char * argv[]) { printf("Sum of 4, 5, 6, 7 = %d\n", sum(4, 4, 5, 6, 7)); printf("Sum of 3, 6, 9 = %d\n", sum(3, 3, 6, 9)); return 0; }
相关文章推荐
- Silverlight C++ XRPack 版本不兼容&资源编译
- C#语言学习:变量的声明与初始化的范围(对比C++)
- c++11中的日期和时间库
- C++11模版元编程的应用
- c++11实现一个简单的lexical_cast
- C语言之广度优先算法
- C++11实现一个自动注册的工厂
- c++ 模板--包含本身就是模板的参数
- C++11::lambda 的用法
- C++Builder 2010深入TForm类之属性
- 利用C++调用天气webservice-gSOAP方法
- 自定义 C++ 中的 range() 函数
- C++ template —— 模板与继承(八)
- c++ 在windows下获取时间和计算时间差的几种方法总结
- C++标准模板库
- C语言单链表实现19个功能完全详解
- 值得推荐的C/C++框架和库 (真的很强大)
- C++ Primer Plus 札记(二)指针
- Java与C/C++比较——对象引用方面
- 《STL源码剖析》之 ROUND_UP()实现原理详解