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

开发太阳能

我已经建立了一个提供从标准异常派生的异常类的库:

#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 );
};

然而,这给了我警告C4275non – DLL-interface class 'std::runtime_error' used as base for DLL-interface class 'BaseException'

不幸的是,我对Microsoft风格的文档有些过敏:过于冗长,而且不是很讲究。对于解决我的实际期望,我一直感到困惑。

你们能启发我吗?我可以只删除基类,然后捕获std::runtime_errorstd::exception不捕获我的自定义异常类,我非常希望这是可能的。所以...?

尼尔

在这种情况下,有几种选择适合您。

  1. 导出它。
  2. 忽略它。
  3. 内联它。

重要的是要记住,从dll导出类的“正确”方法是导出整个类,包括基和成员。因此,在CodeProject上有多种技术,例如这种技术,它们使用“接口”和适当的工厂来创建类(以及匹配的销毁)。

在这种情况下,这对您不太有用,尝试导出std::runtime_error可能会花费更多的精力,并且以后可能会引入更大的问题。

此处Microsoft Connect网站webarchive提取,这些错误的家庭本质上是噪音。

我建议首先避免这种情况-在DLL的接口中放置STL类型会迫使您按照STL的规则进行操作(特别是,您不能混合使用VC的不同主要版本,并且您的IDL设置必须匹配)。但是,有一种解决方法。C4251本质上是噪声,可以将其静音。

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

只要编译器选项在整个项目中是一致的,仅使此警告静音就可以了。

最后一个选择是BaseException内联定义类,而根本不导出它。

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


VS2015的C ++运行时中的更改导致对的导出进行了更改std::exception(未从运行时中导出)。

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

class Exception : exception {
public:
    char const* what() const override;
};

inline char const* Exception::what() const {
    /*...*/
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章