如何dllexport派生自std :: runtime_error的类?

我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_errorstd::exception不会捕获我的自定义exception类,而且我更愿意这样做。 所以…?

在这种情况下有几种选择。

  1. 导出它。
  2. 忽略它。
  3. 在线。

重要的是要记住,从DLL导出类的“正确”方式是导出整个类,包括基础和成员。 由于这个原因CodeProject上有这样一些技术,使用“接口”和适当的工厂来创建类(和匹配的销毁)。

在这种情况下,对于你来说这不是太有用,试图导出std::runtime_error可能是更多的努力,并可能在稍后引入更大的问题。

从这里的微软连接网站 ( webarchive ),这些错误的家庭基本上是噪音;

我建议首先避免这种情况 – 将STL类型放入DLL的界面,迫使你使用STL的规则(特别是不能混合VC的不同主要版本,而且你的IDL设置必须匹配)。 但是,有一个解决方法。 C4251本质上是噪音,可以沉默…

Stephan T. Lavavej(Micrsoft的C ++库的维护者之一)。

只要编译器选项在整个项目中是一致的,只要将这个警告消除就可以了。

最后的选择是内联定义BaseException类,而不是将其导出。

根据我的经验,内联选项几乎总是最容易的异常类。


VS2015的C ++运行时更改,导致std::exception导出更改(不从运行时导出)。

现在内联选项似乎是最适合的(你的里程可能会有所不同)。