转自:http://www.cnblogs.com/cylee025/archive/2011/05/23/2054792.html

在C语言的stdarg.h头文件中提供了三个函数va_start, va_end,va_arg和一个类型va_list。利用它们,我们可以很容易实现一个可变参数的函数。首先简单介绍一下这三个函数。

假设现在有一个名为f的函数,其函数定义为:

  1. void f(int a, int b, ...)

那么,在函数的内部,为了获得这些可变参数,就需要利用到va_start、va_arg和va_end三个函数。

va_list类型的变量可以用于存储可变类型的变量,用它可以对可变变量进行遍历;

  1.  va_list ap

在使用ap之前,必须调用va_start使得ap和可变参数进行关联;

  1. va_start(ap, b);

va_start的第二个参数是函数参数列表中最后一个非可变参数的参数;

然后就可以调用va_arg对参数进行访问了;

  1. type va_arg( ap, type);

在变量处理完成之后,程序结束之前,应该调用va_end一次;

  1. void va_end(ap);

下面的程序展示了一种可变参数函数和CString::FormatV函数联合使用的技术。该技术在VC++编程中被广泛的使用:

  1. #include <iostream>
  2. #include <cstring>
  3. #include <string.h>
  4. #include <atltime.h>
  5.  
  6. using namespace::std;
  7.  
  8. void WriteLogEntry(LPCTSTR pstrFormat, ...)
  9. {
  10. CTime timeWrite;
  11. timeWrite = CTime::GetCurrentTime();
  12. CString str = timeWrite.Format(_T("%d %b %y %H:%M:%S - "));
  13. ATLTRACE(str);
  14.  
  15. va_list args;
  16. va_start(args, pstrFormat);
  17. str.FormatV(pstrFormat, args);
  18. ATLTRACE(str);
  19. return;
  20. }
  21.  
  22. int main()
  23. {
  24. WriteLogEntry(_T("Start Program!\n"));
  25. WriteLogEntry(_T();
  26. WriteLogEntry(_T(, );
  27. WriteLogEntry(_T("Program Abouted!"));
  28. }

程序运行的结果为:

【转】C/C++中可变参数函数的实现的更多相关文章

  1. C语言中可变参数函数实现原理

    C函数调用的栈结构 可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈.例如,对于函数: void fu ...

  2. C/C++中可变参数函数的实现

    在C语言的stdarg.h头文件中提供了三个函数va_start, va_end,va_arg和一个类型va_list.利用它们,我们可以很容易实现一个可变参数的函数.首先简单介绍一下这三个函数. 假 ...

  3. C语言可变参数函数实现原理

    一.可变参数函数实现原理 C函数调用的栈结构: 可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈. 本 ...

  4. c 中可变参数的实现

    我们在C语言编程中有时会遇到一些参数个数可变的函数,例如printf()函数,其函数原型为:     例一: int   printf(   const   char*   format,   ... ...

  5. PHP中的可变参数函数和可选参数函数

    1)可选参数函数.例如: <?phpfunction add($var1,$var2,$var3=0,$var4=0){ return$var1+$var2+$var3+$var4;}echo ...

  6. C语言中可变参数的函数(三个点,“...”)

    C语言中可变参数的函数(三个点,“...”) 本文主要介绍va_start和va_end的使用及原理. 在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end ...

  7. C语言中的可变参数函数

    C语言编程中有时会遇到一些参数个数可变的函数,例如printf()函数,其函数原型为: int printf( const char* format, ...); 它除了有一个参数format固定以外 ...

  8. Swift开发第十篇——可变参数函数&初始化方法顺序

    本篇分为两部分: 一.Swift中的可变参数函数 二.初始化方法的顺序 一.Swift中的可变参数函数 可变参数函数指的是可以接受任意多个参数的函数,在 OC 中,拼接字符串的函数就属于可变参数函数 ...

  9. C可变参数函数 实现

    转自:http://blog.csdn.net/weiwangchao_/article/details/4857567 C函数要在程序中用到以下这些宏: void va_start( va_list ...

随机推荐

  1. 1059. Prime Factors (25)

    时间限制 50 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 HE, Qinming Given any positive integer N, y ...

  2. Mysql编辑工具中使用(Navicat查询结果显示行号)

    Mysql编辑工具中使用(Navicat查询结果显示行号) as rownum,a.roleId ) t where a.roleId='admin';

  3. python学习笔记13(模块、包)

    在Python中有一个概念叫做模块(module),比如在Python中要调用sqrt函数,必须用import关键字引入math这个模块,下面就来了解一下Python中的模块. 模块文件以.py后缀结 ...

  4. js 人工获取年月日

    var date = new Date(); var months = new Array("01", "02", "03", " ...

  5. bnuoj 31796 键盘上的蚂蚁(搜索模拟)

    http://www.bnuoj.com/bnuoj/contest_show.php?cid=2876#problem/31796 [题意]: 如题,注意大小写情况 [code]: #include ...

  6. hdu 4707 Pet(DFS水过)

    http://acm.hdu.edu.cn/showproblem.php?pid=4707 [题目大意]: Lin Ji 的宠物鼠丢了,在校园里寻找,已知Lin Ji 在0的位置,输入N D,N表示 ...

  7. 使用Yeoman搭建 AngularJS 应用 (6) —— 让我们搭建一个网页应用

    原文地址:http://yeoman.io/codelab/review-generated-files.html 打开mytodo文件夹,你会看到现在的基架.如下图所示 在mytodo文件夹,我们能 ...

  8. 使用 PIVOT 和 UNPIVOT

    http://msdn.microsoft.com/zh-cn/library/ms177410%28v=SQL.90%29.aspx 可以使用 PIVOT 和 UNPIVOT 关系运算符将表值表达式 ...

  9. zoj 3365

    题意 给你一个序列  改变尽可能少的数使其成为公差为一 递增的等差数列 可以将给你的序列减去一个等差数列 即num[i] -= i,若得到的数全部相等, 则说明给你的序列本身就满足条件  则只要寻求n ...

  10. VS2005 VS2008 Manifest 配置问题总结

    一.问题 编译某个遗留工程后,运行程序时报错,“由于应用程序的配置不正确,应用程序无法启动.重新安装应用程序可能会解决这个问题.” 查看生成的Manifest文件如下: <?xml versio ...