我想在我的C++应用程序中禁用异常,在MSVC下编译.我已经将选项启用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是打开还是关闭,我都会收到相同的警告.
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++异常.
您需要使用支持异常停用的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
类型id与运行时类型标识有关.您可能还想尝试关闭RTTI.
但是,指定C++标准库的某些部分会抛出异常.如果你禁用它们,你就会进入"未定义行为"的阴暗水域.