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 2019 中的 GDAL 库头文件错误和警告
解决 Visual Studio 2005/2008 中的“Validation (): Element ‘xxxx’ is not supported”警告
Visual Studio Community 2019 中的 C++ 代码分析产生警告 C26486 和 C26414