C++ 关于可变参数的使用(代码中的省略号...的作用)

看别人的C++代码时,总会发现有函数用...来传递可变长参数,最近又遇到一个catch(...),觉得这种函数参数使用方式非常有趣而且节省很多时间,所以在这里记录下来。

1、catch(...)中的“...”这里的作用主要是拦截所有错误,因为有可能这段代码你也不知道有什么错误没有catch到,为了防止意外,可以用这个方法去捕获未知错误,但也有人为了图方便直接只用一个catch(...)的,感觉这样不是特别好,因为可能程序中会针对具体发生的某种异常、错误采取相应的解决办法,如果完全依赖于捕获所有异常,就意味着只要发生任意一个异常程序就会马上陷入中断,而且对程序崩溃之后排查问题增加了难度,个人意见是先将可预见的错误catch,其他未知的再用这个方法。

catch(...)具体使用方法参考代码1

try
{
//to do
}
catch(std::exception &err)
{
    std::cout<<err.what()<<std::endl;
}
catch(...)
{
//这里会拦截住所有try里没有被前面捕获的错误,但是你不知道是什么错误
//如果有前边的catch,这个...一般不会运行到
  std::cout<<"未知错误"<<std::endl;
}

2、 可变参数函数,这和C/C++的标准输出函数printf的实现是相同的,printf的原型:

extern int printf (__const char *__restrict __format, ...);
这个方法为传递未知个数参数的函数提供了行之有效的解决方案,简单明了且易于应用,需要注意的是以下几点:

1)省略号必须在参数列表的末尾,表示后面的参数是未知的,所以省略号后面不能再出现其他参数;

2)可变参数是顺序访问的,如果需要对可变参数进行其他操作,可以先把所有参数取出来再进行;

3)这个函数如果使用不当,可能会造成一些隐患,比如在确定参数中告知要传入2个不确定参数,但是后面却传进来3个不确定参数,那么很明显函数只会读取前面两个参数,这就相当于在使用printf()函数时这样去使用:

printf("output: %d , %d",a,b,c);
printf("output: %d , %d",a);
无论是哪一种,都是不正确的

可变参数函数具体实现方法可以参考代码2

/* --sum.cpp-- 可变参数宏实现求任意个整形值得和 */
#include <stdarg.h>

int sum(int count, ...);      //原型中使用省略号

int sum(int count, ...){      //count 表示可变参数个数
    va_list ap;          //声明一个va_list变量
    va_start(ap, count);     //初始化,第二个参数为最后一个确定的形参

    int sum = 0;  
    for(int i = 0; i < count; i++)          
        sum += va_arg(ap, int); //读取可变参数,的二个参数为可变参数的类型

    va_end(ap);              //清理工作 
    return sum;
}

代码1:百度知道“c++ 中 catch(...)省略号的作用

代码2:CSND博客“C++可变参数函数


  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值