C/C++中可变参数函数的实现
在C语言的stdarg.h头文件中提供了三个函数va_start, va_end,va_arg和一个类型va_list。利用它们,我们可以很容易实现一个可变参数的函数。首先简单介绍一下这三个函数。
假设现在有一个名为f的函数,其函数定义为:
void f(int a, int b, ...)
那么,在函数的内部,为了获得这些可变参数,就需要利用到va_start、va_arg和va_end三个函数。
va_list类型的变量可以用于存储可变类型的变量,用它可以对可变变量进行遍历;
va_list ap
在使用ap之前,必须调用va_start使得ap和可变参数进行关联;
va_start(ap, b);
va_start的第二个参数是函数参数列表中最后一个非可变参数的参数;
然后就可以调用va_arg对参数进行访问了;
type va_arg( ap, type);
在变量处理完成之后,程序结束之前,应该调用va_end一次;
void va_end(ap);
下面的程序展示了一种可变参数函数和CString::FormatV函数联合使用的技术。该技术在VC++编程中被广泛的使用:
#include <iostream>
#include <cstring>
#include <string.h>
#include <atltime.h> usingnamespace::std; void WriteLogEntry(LPCTSTR pstrFormat, ...)
{
CTime timeWrite;
timeWrite = CTime::GetCurrentTime();
CString str = timeWrite.Format(_T("%d %b %y %H:%M:%S - "));
ATLTRACE(str); va_list args;
va_start(args, pstrFormat);
str.FormatV(pstrFormat, args);
ATLTRACE(str);
return;
} int main()
{
WriteLogEntry(_T("Start Program!\n"));
WriteLogEntry(_T("Program has execute %d lines!\n"),);
WriteLogEntry(_T("error %d occured at %d line!\n"),, );
WriteLogEntry(_T("Program Abouted!")); }
C/C++中可变参数函数的实现的更多相关文章
- C语言中可变参数函数实现原理
C函数调用的栈结构 可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈.例如,对于函数: void fu ...
- 【转】C/C++中可变参数函数的实现
转自:http://www.cnblogs.com/cylee025/archive/2011/05/23/2054792.html 在C语言的stdarg.h头文件中提供了三个函数va_start, ...
- C语言可变参数函数实现原理
一.可变参数函数实现原理 C函数调用的栈结构: 可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈. 本 ...
- c 中可变参数的实现
我们在C语言编程中有时会遇到一些参数个数可变的函数,例如printf()函数,其函数原型为: 例一: int printf( const char* format, ... ...
- PHP中的可变参数函数和可选参数函数
1)可选参数函数.例如: <?phpfunction add($var1,$var2,$var3=0,$var4=0){ return$var1+$var2+$var3+$var4;}echo ...
- C语言中可变参数的函数(三个点,“...”)
C语言中可变参数的函数(三个点,“...”) 本文主要介绍va_start和va_end的使用及原理. 在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end ...
- C语言中的可变参数函数
C语言编程中有时会遇到一些参数个数可变的函数,例如printf()函数,其函数原型为: int printf( const char* format, ...); 它除了有一个参数format固定以外 ...
- Swift开发第十篇——可变参数函数&初始化方法顺序
本篇分为两部分: 一.Swift中的可变参数函数 二.初始化方法的顺序 一.Swift中的可变参数函数 可变参数函数指的是可以接受任意多个参数的函数,在 OC 中,拼接字符串的函数就属于可变参数函数 ...
- C可变参数函数 实现
转自:http://blog.csdn.net/weiwangchao_/article/details/4857567 C函数要在程序中用到以下这些宏: void va_start( va_list ...
随机推荐
- Java中Sax解析XML
SAX基于事件的解析,解析器在一次读取XML文件中根据读取的数据产生相应的事件,由应用程序实现相应的事件处理逻辑,即它是一种“推”的解析方式:这种解析方法速度快.占用内存少,但是它需要应用程序自己处理 ...
- CentOS7 上以 RPM 包方式安装 Oracle 18c 单实例
安装阿里云 YUM 源 https://opsx.alibaba.com/mirror?lang=zh-CN 一.安装Oracle数据库 1.安装 Oracle 预安装 RPM yum -y loca ...
- JAVA核心技术I---JAVA基础知识(查漏补缺private,static)
一:private对于类和对象(同C++) private是只有这个类内部可以访问(类的成员函数和定义初始化) private是类之间的限制,而不是对对象的限制<重点> 同类对象是可以直接 ...
- BIO和NIO
在了解BIO,NIO,AIO之前先了解一下IO的几个概念: 1.同步与异步 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous com ...
- C# Serializable
System.SerializableAttribute 串行化是指存储和获取磁盘文件.内存或其他地方中的对象.在串行化时,所有的实例数据都保存到存储介质上,在取消串行化时,对象会被还原,且不能与其原 ...
- 解析ArcGis的标注(三)——标注的放置 与 转注记修改
该“标注”系列博文的标注引擎使用“标准标注引擎(standard label engine)”,这个概念如不知道,可不理会,ArcGis默认标注引擎就是它. 写着写着发现ArcGis标注的破事儿好多啊 ...
- JS处理数据四舍五入
一,使用Math.toFixed toFixed() 方法可把 Number 四舍五入为指定小数位数的数字. 语法NumberObject.toFixed(num) 但是网友说toFixed bug比 ...
- ASP.NET Web API 2 之 HttpRequestMessage 对象
Ø 前言 在 Web API 中经常会使用到 HttpRequestMessage 和 HttpResponseMessage 对象,这两个对象封装了对 Web API 的请求和响应,位于 Syst ...
- SQLMap用户手册【超详细】
http://192.168.136.131/sqlmap/mysql/get_int.php?id=1 当给sqlmap这么一个url的时候,它会: 1.判断可注入的参数 2.判断可以用那种SQL注 ...
- springboot使用jpa+mongodb时,xxxRepository不能Autowired的问题
springboot启动类: @SpringBootApplication public class MainApp { public static void main(String[] args) ...