【问题标题】:what is the use of ... in c++c++中...的用途是什么
【发布时间】:2013-12-07 21:02:01
【问题描述】:

我尝试使用谷歌搜索 ...,但正如预期的那样,谷歌忽略了它。

我有这个代码:

try {

// some code
}

catch( ... ) {
// catch logic

}

我猜... 表示任何类型的例外,对吗?
还有其他用途吗?

【问题讨论】:

  • 是的,你是对的。
  • @OldProgrammer 还有其他用途吗?
  • 你是对的。在函数原型的上下文中还有另一种用法,这意味着调用者可以传递任意数量的参数。例如void format(char* formatString, ...); 但别搞错了,这个被认为是 C 遗产而不是正确的 C++。
  • MSVC++ 使用这种语法来捕获操作系统异常,他们称之为 SEH(结构化异常处理)。顺便说一句,这种用法很有争议。

标签: c++ operators


【解决方案1】:

我知道三个用例:

  • 可变数量的参数,例如'printf(const char* fmt, ...)'
  • 一个 catch 任何东西都是 'catch(...)'
  • 像'template '这样的可变参数模板并解压'T ...' (c++11)

我错过的另一个是预处理:可变参数宏

【讨论】:

    【解决方案2】:

    是的,你是对的,catch(...) 表示捕获所有异常。但是,通过 const 引用捕获异常是一个好习惯。喜欢

    catch(std::exception const & ex) 
    { 
    //code here
    } 
    

    来自MSDN备注部分:

    备注:-

    try 子句之后的代码是代码的保护部分。这 throw 表达式抛出(引发)异常。之后的代码块 catch 子句是异常处理程序,并捕获(处理) throw 表达式抛出的异常,如果 throw 中的类型和 catch 表达式是兼容的。有关适用的规则列表 catch 块中的类型匹配,请参阅 _。如果 catch 语句 指定省略号 (...) 而不是类型,即 catch 块 处理任何类型的异常,包括 C 异常和系统或 应用程序生成的异常,例如内存保护,除以 零和浮点违规。因为尝试了 catch 块 程序顺序,这样的处理程序必须是其尝试的最后一个处理程序 堵塞。 谨慎使用 catch (...);通常这样的 catch 块是 用于记录错误并在停止之前执行任何特殊清理 程序执行。除非 catch 块知道如何>处理捕获的特定异常,否则不允许程序继续运行。

    try {
       throw CSomeOtherException();
    }
    catch(...) {  // Catch all exceptions – dangerous!!!
       // Respond (perhaps only partially) to exception
       throw;       // Pass exception to some other handler
    }
    

    这个还有其他用途吗?

    我看到的一个是可变数量的参数的用法,例如'printf(const char* x, ...)'

    【讨论】:

      最近更新 更多