我可以在STL中禁用异常吗?

时间:2009-02-16 12:03:23

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

我想禁用在MSVC下编译的C ++应用程序中的异常。我已经将选项启用C ++异常切换为NO,但是我收到警告告诉我使用选项/ 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是打开还是关闭,我都会收到相同的警告。

3 个答案:

答案 0 :(得分:10)

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 ++例外。

答案 1 :(得分:7)

您需要使用支持异常停用的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

答案 2 :(得分:5)

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

但是,指定C ++标准库的某些部分会抛出异常。如果你禁用它们,你就会进入“未定义行为”的阴暗水域。