常见的有catch(...)和 int printf(const char*,...);前者容易理解,省略号代表其他所有情况,后者吗..?
其实本质上应该都是 不定参数函数.它的调用方式是_cedel,也就是说由被调用都恢复堆栈。原理如下:
template <class FT,class MT=FT>
class arg_list{
public:
arg_list(FT &ft):_ft(&ft),_count(0){va_start(_val,*_ft);}
MT next(){_count++;return va_arg(_val,MT);}
void end(){va_end(_val);}
int count(){return _count;}
private:
FT* _ft;
va_list _val;
int _count;
};
int average(int p,...){
int sum=0,int i=p,count=0;
arg_list<int> arg(p);
while(i!=END_ARG)
sum+=i,i=arg.next();
arg.end();
return sum/arg.count();
}
应用实例:
void Msg(TCHAR *szFormat, ...);
void Msg(TCHAR *szFormat, ...)
{
TCHAR szBuffer[10
带三点省略号的参数调用
最新推荐文章于 2022-08-06 10:15:07 发布
本文探讨了C++中的不定参数函数,如`catch(...)`和`printf()`,并介绍了`arg_list`模板类来处理不定参数。通过示例展示了如何使用`va_list`进行参数恢复和计算平均值。同时,提到了在Windows API中`__cdecl`和`__stdcall`调用约定的区别,以及在实际应用中的安全注意事项,如防止缓冲区溢出。
摘要由CSDN通过智能技术生成