我想禁用在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是打开还是关闭,我都会收到相同的警告。
答案 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 ++标准库的某些部分会抛出异常。如果你禁用它们,你就会进入“未定义行为”的阴暗水域。