我build立了一个库,提供了一个从标准exception派生的exception类:
#include <stdexcept> #include <string> class BaseException : public std::runtime_error { public: BaseException( std::string const & msg ); };
到现在为止还挺好。 在Unix上编译和处理得很好。 现在我准备将其编译到Windows DLL中:
#ifdef WIN32 #define MY_EXPORT __declspec(dllexport) #else #define MY_EXPORT #endif #include <stdexcept> #include <string> class MY_EXPORT BaseException : public std::runtime_error { public: BaseException( std::string const & msg ); };
但是,这给了我警告C4275 : non – DLL-interface class 'std::runtime_error' used as base for DLL-interface class 'BaseException'
。
不幸的是,我对微软风格的文档有些过敏:过分罗嗦,而不是很重要。 它让我完全糊涂,实际上我希望解决我的问题。
你们能开导我吗? 我可以放下基类,但是捕获std::runtime_error
或std::exception
不会捕获我的自定义exception类,而且我更愿意这样做。 所以…?
在这种情况下有几种选择。
重要的是要记住,从DLL导出类的“正确”方式是导出整个类,包括基础和成员。 由于这个原因CodeProject上有这样一些技术,使用“接口”和适当的工厂来创建类(和匹配的销毁)。
在这种情况下,对于你来说这不是太有用,试图导出std::runtime_error
可能是更多的努力,并可能在稍后引入更大的问题。
从这里的微软连接网站 ( webarchive ),这些错误的家庭基本上是噪音;
我建议首先避免这种情况 – 将STL类型放入DLL的界面,迫使你使用STL的规则(特别是不能混合VC的不同主要版本,而且你的IDL设置必须匹配)。 但是,有一个解决方法。 C4251本质上是噪音,可以沉默…
Stephan T. Lavavej(Micrsoft的C ++库的维护者之一)。
只要编译器选项在整个项目中是一致的,只要将这个警告消除就可以了。
最后的选择是内联定义BaseException
类,而不是将其导出。
根据我的经验,内联选项几乎总是最容易的异常类。
VS2015的C ++运行时更改,导致std::exception
导出更改(不从运行时导出)。
现在内联选项似乎是最适合的(你的里程可能会有所不同)。