微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何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' 。

不幸的是,我对微软风格的文档有些过敏:过分罗嗦,而不是很重要。 它让我完全糊涂,实际上我希望解决我的问题。

.NET 4.0 – AccessViolationException和WndProc

信号处理程序在C中停止定时器

为什么SetUnhandledExceptionFilter不能捕获一些exception,但AddVectoredExceptionHandler可以做到

高级防火墙exception批量(任何方向)

ocl :: CRException的Typeinfo

你们能开导我吗? 我可以放下基类,但是捕获std::runtime_error或std::exception不会捕获我的自定义exception类,而且我更愿意这样做。 所以…?

C#exception和代码中断

WCF Windows服务超时

在Python 3.3中捕获TimeoutExpiredexception

C ++exception处理程序问题

从catch块获取回溯

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

导出它。

忽略它。

在线。

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

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

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

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

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

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

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐