【问题标题】:Can I disable exceptions in STL?我可以在 STL 中禁用异常吗?
【发布时间】:2010-10-07 21:00:33
【问题描述】:

我想禁用在 MSVC 下编译的 C++ 应用程序中的异常。我已将启用 C++ 异常选项切换为否,但我收到警告,告诉我使用选项 /Ehsc,我不想这样做。


我的代码中没有 try/catch 块,但我使用 STL。我发现使用宏定义 _HAS_EXCEPTIONS=0 应该禁用 STL 中的异常,但我仍然收到如下警告:


warning C4275: non dll-interface class 'stdext::exception' used as base for dll-interface class 'std::bad_typeid' see declaration of 'stdext::exception' see declaration of 'std::bad_typeid'


有什么办法可以关闭异常是STL?

注意:在我的代码中,我也想关闭 RTTI 选项。无论 RTTI 是打开还是关闭,我都会收到相同的警告。

【问题讨论】:

    标签: c++ visual-c++ stl exception-handling


    【解决方案1】:

    类型 id 与运行时类型标识有关。您可能还想尝试关闭 RTTI。

    但是,C++ 标准库的某些部分被指定为抛出异常。如果您禁用它们,您将驶入“未定义行为”的浑水。

    【讨论】:

      【解决方案2】:

      您需要使用支持异常停用的 STL。这通常是一个编译时宏定义。

      除非我弄错了,否则 STLPort 提供了 _STLP_USE_EXCEPTIONS=0 和 _STLP_NO_EXCEPTIONS。我不知道程序在这些设置下的表现如何。 ;)

      我认为 MS STL 中也有一些隐藏的标志。

      EASTL 开箱即用,禁用异常:

      http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html

      【讨论】:

        【解决方案3】:

        Microsoft STL 支持异常解除。

        对于 MSVC STL,定义宏 _HAS_EXCEPTIONS=0 会在您将应用程序与 libcmt.lib/libcmtd.lib(/MT 或 /MTd 编译器选项)链接时禁用异常。

        如果您与 msvcrt.lib/msvcrtd.lib(/MD 或 /MDd 编译器选项)链接,您需要再定义一个宏 - _STATIC_CPPLIB。在这种情况下,请在包含任何 STL 代码之前添加以下行:

        #define _HAS_EXCEPTIONS 0
        #define _STATIC_CPPLIB
        

        或将以下内容添加到编译器选项中:

        -D_HAS_EXCEPTIONS=0 -D_STATIC_CPPLIB
        

        请注意,您需要在项目设置中禁用 C++ 异常。

        【讨论】:

        • 我不明白的是,在使用 /MD 或 /MDd 时为什么我们需要 _STATIC_CPPLIB。据我所知,它会导致代码使用 libcmt.lib 而不是 msvcrtd.lib。使用 /MD 的全部意义在于拥有动态链接库而不是静态链接库。添加 _STATIC_CPPLIB 似乎违背了使用 /MD 标志的目的。
        • _STATIC_CPPLIB 在 MSVC 2010 中已弃用,因此在 MSVC 2010 中使用它只会将一组警告替换为另一组警告。
        • gnash117,MSVC2008 的 MSDN 说,当使用 _STATIC_CPPLIB 预处理器定义时,您的应用程序链接 libcmt.lib 而不是 msvcprt.lib,但仍通过 msvcrt.lib 动态链接到主 CRT。
        • 如果 stl 容器没有足够的内存会发生什么,例如?它会崩溃吗?
        • @sasha.sochka 通常,如果不使用异常,STL 应用程序只会调用 terminate()。对于这种情况,我们需要使用另一种方式来处理 STL 错误,例如stackoverflow.com/questions/3870435/…
        猜你喜欢
        • 1970-01-01
        • 2016-07-30
        • 2011-02-13
        • 2013-01-19
        • 2014-07-29
        • 1970-01-01
        • 1970-01-01
        • 2015-10-15
        • 1970-01-01
        相关资源
        最近更新 更多