看别人的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++可变参数函数”