C语言-11-可变参数的实现方案
概述
- 某种情况下,我们可能需要一个具有可变参数的函数,C语言提供了一种标准的实现可变参数的方法
- C语言实现可变参数的方案是基于标准库<stdarg.h>的
- 可变参数的类型
- 可变参数可以放在一个集合中,可以使用指针类型的参数或引用类型的参数来实现可变参数
- 可变参数不可以放到一个集合中,可以使用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,则函数返回的结果是未定义的
- void va_start(va_list ap, last_arg)
- 一个类型
实现方案
形式
- 实现可变参数的函数的参数列表通常包括以下两部分
- 固定参数列表,通常包含可变参数的总个数信息(通常为固定参数列表中的最后一个参数,即省略号'...'前的那个参数)
- 可变参数列表,使用省略号'...'表示
- 实现可变参数的函数的参数列表通常包括以下两部分
步骤
- 定义一个函数,最后一个参数为省略号'...',且省略号前的那个参数总是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;
}
C语言-11-可变参数的实现方案的更多相关文章
- [11 Go语言基础-可变参数函数]
[11 Go语言基础-可变参数函数] 可变参数函数 什么是可变参数函数 可变参数函数是一种参数个数可变的函数. 语法 如果函数最后一个参数被记作 ...T ,这时函数可以接受任意个 T 类型参数作为最 ...
- C语言的可变参数在Linux(Ubuntu)与Windows下注意点
基本上C语言的可变参数原理在不同平台和不同编译器下基本类似(通过函数入栈,从右向左,从高位到低位地址),不过部分实现会有所不同:在使用中需要注意的是: va_list 为char 类型指针,部分调用如 ...
- C语言中可变参数的函数(三个点,“...”)
C语言中可变参数的函数(三个点,“...”) 本文主要介绍va_start和va_end的使用及原理. 在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end ...
- C++ 11可变参数接口设计在模板编程中应用的一点点总结
概述 本人对模板编程的应用并非很深,若要用一句话总结我个人对模板编程的理解,我想说的是:模板编程是对类定义的弱化. 如何理解“类定义的弱化”? 一个完整的类有如下几部分组成: 类的名称: 类的成员变量 ...
- C语言中可变参数的原理——printf()函数
函数原型: int printf(const char *format[,argument]...) 返 回 值: 成功则返回实际输出的字符数,失败返回-1. 函数说明: 使用过C语言的人所再熟悉不过 ...
- C语言中可变参数函数实现原理
C函数调用的栈结构 可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈.例如,对于函数: void fu ...
- C语言中可变参数的用法
原文地址: http://blog.csdn.net/wooin/archive/2006/04/29/697106.aspx 我们在C语言编程中会遇到一些参数个数可变的函数,例如printf() ...
- C语言函数可变参数列表
C语言允许使用可变参数列表,我们常用的printf函数即为可变参数函数,C标准库提供了stdarg.h为我们提供了这方面支持:该头文件提供了一些类型和宏来支持可变参数列表,包括类型va_list,宏v ...
- c++11——可变参数模板
在c++11之前,类模板和函数模板只能含有固定数量的模板参数,c++11增加了可变模板参数特性:允许模板定义中包含0到任意个模板参数.声明可变参数模板时,需要在typename或class后面加上省略 ...
随机推荐
- IIS6.0启动网站ManagedPipelineHandler异常
处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler” 开发web项目需要安装IIS,当安装完以后,web程 ...
- JS魔法堂:追忆那些原始的选择器
一.前言 ...
- DZNEmptyDataSet,优秀的空白页或者出错页封装
简介 项目主页:https://github.com/dzenbot/DZNEmptyDataSet 提示:主要用于UITableView和UICollectionView,也可以用于UIScroll ...
- iOS实现图像指定区域模糊
在大多图像处理中,我们会应用到高斯模糊处理图像,通常用它来减少图像噪声以及降低细节层次.在此文中介绍了高斯模糊的实现和可选区域的模糊[美图秀秀-背景虚化] 高斯模糊的原理中,它是根据高斯曲线调节像素色 ...
- python+selenium+unittest,爬虫电影网站
以前经常在这个网站上下载电影下来看,这个网站比较坑的就是,主页上只有电影的名称,但是评分是看不到的:只有再点击电影名字,进入电影主页时才能看到评分.一般下载的电影都是评分高的才看,低的就忽略掉了.每次 ...
- 通俗易懂的ListView讲解(Adapter、图、实例)
2016/4/5 17:22] 之前写listview其实写了很多次,但好像还是模模糊糊的感觉,直到今天准备写tab的时候被告诉说原理有像的地方,于是我就先来分析整理一下listview好了 先来 ...
- 虚拟机service network restart没有反应解决方法
一般我们新copy的虚拟机或新克隆的虚拟机第一次启动时都会出现没有ip地址的情况: [root@zejin243 network-scripts]# ifconfig lo Link ...
- Node.js爬虫抓取数据 -- HTML 实体编码处理办法
cheerio DOM化并解析的时候 1.假如使用了 .text()方法,则一般不会有html实体编码的问题出现 2.如果使用了 .html()方法,则很多情况下(多数是非英文的时候)都会出现,这时, ...
- LNK1179 无效或损坏的文件: 重复的 COMDAT“_IID_IDispatchEx”
fatal error LNK1179: invalid or corrupt file: duplicate comdat "XXX" LNK1179 无效或损坏的文件: 重复 ...
- SQLDMOHelper
在网上传闻SQLDMO是个好东西,当时没有注意这个传闻是什么时候了,后来才在微软的官网上看见,从SQL Server2008开始就不用SQLDMO了,取而代之的是SMO.无奈了,还写了个Helper. ...