【问题标题】:What does "warning C4987: nonstandard extension used: 'throw (...)'" mean?“警告 C4987:使用了非标准扩展:'throw (...)'”是什么意思?
【发布时间】:2012-09-12 21:35:36
【问题描述】:

我正在尝试编译一个 VC++ 项目,它抱怨这个错误

Microsoft Visual Studio 10.0\VC\atlmfc\include\atlalloc.h(517): warning C4987: nonstandard extension used: 'throw (...)'

它指向的线是

_Ret_opt_bytecap_x_(nElements * sizeof(T)) T* Allocate(_In_ size_t nElements) throw( ... )
    {
        return( AllocateBytes( ::ATL::AtlMultiplyThrow(nElements,sizeof( T )) ) );
    }

【问题讨论】:

  • throw( ... ) 应该是什么意思?正如编译器所说,这不是标准的
  • 这意味着您正在使用语言扩展...
  • 是C项目还是C++项目?因为在 C 中,trycatchthrow 不是语言标准的一部分,而在 C++ 中却是。
  • 请注意,这是一个警告,而不是错误。但奇怪的是,微软自己的代码与他们的编译器不兼容。
  • 这是您在使用 /Wall 编译时会收到的许多警告之一。也许你完全用 /Za 禁用了扩展,尽管你通常不会走得太远。当代码使用非标准扩展时收到警告是警告的用途。整个异常规范崩溃是这个问题的核心,一个暂时不会消失的问题。

标签: c++ visual-c++ atl visual-studio-2010


【解决方案1】:

这意味着throw(...) 异常规范是一个非标准的扩展(如果曾经有一个则不能回答......),也就是说,C++ 标准没有为这段代码定义一个含义。在 Visual Studio 中,这意味着该函数可能会引发任何异常。

如果是您自己的代码,您可以通过简单地删除异常规范来修复警告(好吧,无论如何,对于 C++ 异常;我不知道这会如何影响 Microsoft 的结构化异常处理)。

【讨论】:

  • SEH 不会受到任何影响。唯一影响它的东西(更严格地说——在异常时调用局部变量的析构函数的自动异常处理代码)——是全局异常处理标志。
猜你喜欢
  • 2017-04-02
  • 2013-08-24
  • 1970-01-01
  • 2013-08-18
  • 2017-06-29
  • 2020-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多