Visual Studio 中的 C4275 警告

Posted

技术标签:

【中文标题】Visual Studio 中的 C4275 警告【英文标题】:C4275 warning in Visual Studio 【发布时间】:2011-03-06 00:23:49 【问题描述】:

在 VS2008 中编译我的代码时收到此警告

警告 C4275:非 dll 接口类“std::runtime_error”用作 dll 接口类“MyException”的基础 2> c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\stdexcept(148) : 参见 'std::runtime_error' 的声明

我的班级被定义为

class MyException : public std::runtime_error

【问题讨论】:

【参考方案1】:

MSDN:http://msdn.microsoft.com/en-us/library/3tdb471s.aspx

“一个导出的类[在 DLL 中] 派生自一个未导出的类[在 DLL 中]。”

显然您声明MyException 可从DLL 导出(使用:__declspec(dllexport)),而std::runtime_error 不可导出。考虑MyException 是否真的需要可导出。但是,如果上述页面上列出的问题均不适用于您的具体案例,那么您可以忽略该警告 - 请注意这些问题。

【讨论】:

来自上面链接的页面:“如果您从标准 C++ 库中的类型派生,则可以在 Visual C++ 中忽略 C4275”。您来自std::runtime_error,因此您可以忽略警告。 @mbdevpl 该页面还说您需要compiling a debug release (/MTd),这是非常没用的,因为/MTd 意味着与静态CRT 链接!除非这篇文章真的意味着/MDd?无论如何,这篇文章给出了一个链接,告诉你不应该静态链接 CRT,所以这可能是文章中的一个错误。【参考方案2】:

我来到这里寻找同样问题的答案。我有一个从 std::runtime_error 派生的自定义异常,并且正在从我的 dll 中导出它。

对于例外情况,似乎最简单的解决方案是不导出派生类。如果将实现从源 (.CPP) 文件移动到标头 (.HPP) 中,则可以执行此操作。对我来说,这是微不足道的。我想在大多数情况下都会出现这种情况。

这是一件“好事”,因为客户端实际编译并将自定义异常的实现与其 std::runtime_error 的实现链接。这就是您想要的,实际上也是 C4275 警告试图保护您免受的:两种 std::runtime_exception 对象类型之间的运行时不兼容。

【讨论】:

以上是关于Visual Studio 中的 C4275 警告的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio中的警告C6385

禁止对 Visual Studio 中的所有项目发出警告

Visual Studio 2019 中的 GDAL 库头文件错误和警告

解决 Visual Studio 2005/2008 中的“Validation (): Element ‘xxxx’ is not supported”警告

Visual Studio Community 2019 中的 C++ 代码分析产生警告 C26486 和 C26414

Visual Studio 禁用特定目录中文件的警告