在构建导出包含ATL :: CString成员的类的DLL时发出警告C4251

Rob*_*Rob 21 c++ dll atl dllexport

我正在将基于ATL的静态库转换为DLL,并且在使用ATL CString类(在atlstr.h中找到)的任何导出类上收到以下警告:

警告C4251:'Foo :: str_':类'ATL :: CStringT'需要让dll接口被'Foo'类的客户端使用

我正确地声明Foo该类是通过导出的__declspec(dllexport).这是一个我可以放心忽视的警告,还是我做错了什么?DLL项目设置被设置为与ATL动态链接,但这似乎没有任何区别.

例如:

#ifdef DLLTEST_EXPORTS
#define DLLTEST_API __declspec(dllexport)
#else
#define DLLTEST_API __declspec(dllimport)
#endif

// This class is exported from the DLLTest.dll
class DLLTEST_API Foo
{
public:
 Foo();
 CString str_; // WARNING C4251 HERE
};
Run Code Online (Sandbox Code Playgroud)

此DLL的所有客户端也将使用ATL.

Ofe*_*lon 18

这个帖子给出了我认为更好的答案,Doug Harrison(VC++ MVP):

当你在dllexported类Y中使用非dllexported类X时会发出[此警告].这有什么不好的?好吧,假设Y有一个内联函数y_f,它调用属于X的函数x_f,它也不是内联函数.如果在某个不静态链接X的客户端内部内联y_f,则链接将失败,因为将找不到x_f.

  • 该链接已删除. (5认同)
  • @Knitschi:(1)从技术上讲,我认为警告是由编译器前端发出的,不知道内联决策,(2)我个人认为这个警告应该完全省略.即使在内联函数中使用未导出的类 - 损坏是链接错误,而不是运行时错误,应该可以立即修复. (3认同)
  • WebArchive:https://web.archive.org/web/20170811142318/http://www.microsoft-questions.com/microsoft/VC-Language/30952961/a-solution-to-warning-c4251--class-needs -to-有-dllinterface.aspx (2认同)

Yoc*_*mer 12

这个Microsoft页面帮助了我.

如何导出标准模板库(STL)类的实例化以及包含作为STL对象的数据成员的类

  • WebArchive https://web.archive.org/web/20141227011407/http://support.microsoft.com/kb/168958 (3认同)

Joh*_*ing 7

这是一个很好地讨论这个问题的主题.

简而言之,编译器警告您,实际上,导出的类不会将接口与实现分离.如果客户无法访问相关成员,请将其设为私有,并#pragma远离该成员/类的警告.如果成员可以被客户端访问和使用,那么您将需要通过访问器和更改器提供对成员的间接访问.

  • 因此,如果警告的对象已经是该类的私有对象,我们可以放心地忽略此警告吗? (7认同)