“警告 C4987:使用了非标准扩展:'throw (...)'”是啥意思?

Posted

技术标签:

【中文标题】“警告 C4987:使用了非标准扩展:\'throw (...)\'”是啥意思?【英文标题】: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 禁用了扩展,尽管你通常不会走得太远。当代码使用非标准扩展时收到警告是警告的用途。整个异常规范崩溃是这个问题的核心,一个暂时不会消失的问题。 【参考方案1】:

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

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

【讨论】:

SEH 不会受到任何影响。唯一影响它的东西(更严格地说——在异常时调用局部变量的析构函数的自动异常处理代码)——是全局异常处理标志。

以上是关于“警告 C4987:使用了非标准扩展:'throw (...)'”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章