我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] 举报,一经查实,本站将立刻删除。