转自:http://www.cnblogs.com/jerrychenfly/archive/2010/10/22/1858232.html

下面,我们来看一下,如果在c++的函数中接收数量不定的函数参数。这种形式如同在C#的函数参数列表中使用params 类型的参数。

  我们可以将函数定义成能够接受任意数量的实参。通过将省略号(3个句点...)写在函数定义中形参列表的最后,即可表示调用该函数时可以提供数量可变的实参。例如:

  int sumValues(int first,...)

  {

    //Code for the function

  }

  函数定义中必须至少有一个普通形参,但也可以有多个。省略号必须总是放在形参列表的最后。

  显然,定义中没有关于可变列表中实参的类型或数量的任何信息,因此我们的函数代码必须弄清楚自己被调用时接收的是什么。本地C++库在stdarg.h头文件中定义了va_start、va_arg、和va_end宏,以帮助我们做这件事。用示例来说明其用法是最容易的。

  

  

  #include <iostream>
  #include "stdarg.h"

  using namespace std;

  int sum(int count,...)
  {
     if(count<=0)
        return 0;
     va_list arg_ptr;
     va_start(arg_ptr,count);

    int sum = 0;
     for (int i=0;i<count;i++)
     {
        sum+=va_arg(arg_ptr,int);
     }
     va_end(arg_ptr);
     return sum;
    }

  int main()
  {

    cout<<sum(2,4,6,8,10,12)<<endl;
     cout<<sum(2,22,33,44,55,66,77,88,99)<<endl;
     return 0;
  }

  本例结果:

    10

    55

    按任意键继续。。。

  示例说明

   main()函数函数在两条输出语句中调用了sum()函数,第一次有6个实参,第二次有9个实参。

  sum()函数有一个int类型的普通形参,它表示后面跟着的实参的数量。形参列表中的省略号表明可以传递任意数量的实参。基本上,我们有两种方法来确定调用该函数时有多少实参:第一是像sum()函数一样,用某个固定的形参指定实参的数量;第二是要求最后一个实参具有特殊的标记值,以便我们进行检查和确认。

  为了开始处理可变的实参列表,我们首先声明一个va_list类型的指针:

  va_list arg_ptr;

  va_list 类型是在stdarg.h头文件中定义的,该指针用来依次指向各个实参。

  va_start宏用来初始化arg_ptr,使其指向列表中的第一个实参:

  va_start宏用来初始化arg_ptr,使其指向列表中的第一个实参:

  va_start(arg_ptr,count);

  这个宏的第二个实参是函数形参列表中活力号前面固定形参的名称,用来确定第一个可变实参的位置。

  我们在for循环中取出列表中各个实参的值:

  for (int i=0;i<count;i++)
   {
      sum+=va_arg(arg_ptr,int);
   }

  var_arg宏返回arg_ptr指向的位置存储的实参值,并使arg_ptr递增,以指向下一个实参值。va_arg宏的第二个实参是第一个实参的类型,决定着我们得到的数值以及va_arg递增的方式,因此如果该实参不正确,将造成混乱。程序也许会执行,但我们得到的数值将是无用数据,而且arg_ptr将被错误地递增,从而指向另外的无用数据。

  当结束检索实参值之后,我们用下面这条语句使arg_ptr复位:

  va_end(arg_ptr);

  va_end宏将我们传递给它的实参--va_list类型的指针复位成空值。始终这样做是个好主意,因为在处理过实参之后,arg_ptr将指向某个不包含有效数据的存储单元。

转载于:https://www.cnblogs.com/litmin/p/7508682.html

C++ 不定参数(转)相关推荐

  1. C技巧:结构体参数转成不定参数

    下面这段程序是一个C语言的小技巧,其展示了如何把一个参数为结构体的函数转成一个可变参数的函数,其中用到了宏和内建宏"__VA_ARGS__",下面这段程序可以在GCC下正常编译通过 ...

  2. c语言里的多参数吗,C语言中不定参数的实现

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 但是请注意,由於 K&R C 中并不检查参数型态,so 在此是用 ANSI C 来说明,毕竟 ANSI C 是目前所有 C Compiler 都支 ...

  3. 函数参数 不定参数,和 默认参数

    实现查找一个字符串中是否包含若干"子串" function containsAll(haystack) { for (var i=1; i<arguments.length; ...

  4. iOS 实现不定参数方法

    在iOS要实现不定参数的函数,有一个方案是用C/C++中的va_list.va_start.va_arg.va_end来实现.这样实现需要一个哨兵参数,就是调用方法是最后必须要加一个nil或者0的参数 ...

  5. Java 反射 不定参数bug

    Java 反射 不定参数bug 遇到的第一个关于反射的bug:java.lang.IllegalArgumentException: wrong number of arguments的问题解析如下: ...

  6. 2020-11-28(不定参数的函数)

    c\c++将不定长参数的函数定义为: a.至少要有一个参数: b.所有不定长的参数类型传入时都是dword类型: c.需在某一个参数中描述参数的总个数或将最后一个参数赋值为结尾标记. 有了这三个特性, ...

  7. C、C++不定参数的使用

    不定参数当年做为C/C++语言一个特长被很多人推崇,但是实际上这种技术并没有应用很多.除了格式化输出之外,我实在没看到多少应用.主要原因是这种技术比较麻烦,副作用也比较多,而一般情况下重载函数也足以替 ...

  8. c语言int val,c语言不定参数与printf函数的实现

    今天学习了C语言不定参数,C语言中的不定参数主要靠这个头文件实现,这个头文件包含了va_list().va_start().va_end()三个宏,其用法为先声明一个va_list类型的变量,它用于访 ...

  9. python函数不定参数_python如何定义不定参数函数

    *args,可以传入任意多个参数 **args,以字典形式传入任意多个参数 元组形式: 1.定义函数 def test1(*args): print('################test1### ...

  10. c语言如何实现不定参数,C语言中不定参数的实现

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 但是请注意,由於 K&R C 中并不检查参数型态,so 在此是用 ANSI C 来说明,毕竟 ANSI C 是目前所有 C Compiler 都支 ...

最新文章

  1. [CoolStuff]有趣的Zumobi
  2. C++ new和delete(C++动态分配和释放内存)
  3. 搭建nginx + python + django +memcached+ mysql +fastcgi 环境
  4. leetcode 62. 不同路径(dp)
  5. 把数字随机分成 php,php随机数 微信随机生成红包金额算法php版
  6. 在电脑上怎么打印文件_电脑上怎么mov格式怎么转换成mp4
  7. 如何安装mysql 8.0.12_基于Windows安装MySQL 8.0.12图文教程
  8. centos 打包RPM包 ntopng
  9. 记Python的一些用法
  10. 微信小程序图片转换成文字_怎么利用微信小程序把图片上的文字转到word文本中?...
  11. 8位数控分频器的设计_数控分频器的VHDL设计
  12. 软件工程人才的社会需求现状与发展分析
  13. elasticsearch 配置 之 discovery.zen.ping.unicast.hosts
  14. 中继器 网桥 路由器 网关
  15. MonkeyPatchWarning: Monkey-patching ssl after ssl has already been imported may lead to errors
  16. canal mq数据同步
  17. 如果你的网站需要免费的 SVG 插图,一定不要错过 Undraw 这个网站
  18. 用c语言编写程序,求∑(k=1~100)k+∑(k=1~50)k2,c语言程序,求(100∑k=1 k)+(50∑k=1 k^2)+(10∑k=1 1/k) 这...
  19. 如何选择一款适合自己的医疗险,看保通来详解
  20. 青龙面板获取京东ck的新老方法

热门文章

  1. typo(ruby的开源blog)系统的安装
  2. 从报表到大数据分析,BI工具如何提高用户体验
  3. 拦截器获取请求参数post_spring boot拦截器中获取request post请求中的参数
  4. android get方法的使用方法,android之HttpPostHttpGet使用方法介绍
  5. linux关闭mysql日志记录_linux 下mysql 运行一段时间后自动关闭,日志无异常
  6. android field 类型,Gradle buildConfigField 使用Hashmap ArrayList 等类型
  7. linux内核调度,Linux内核的三种调度策略
  8. stm32 系统进入stop模式_STM32低功耗控制心得体会
  9. iphone导出照片到电脑_苹果手机照片删除了怎么恢复?简单方法图文教程
  10. Java 1.1.2 字符串之拼接