我们可以忽略MySQL ++ C4275警告吗?

时间:2010-09-25 09:58:10

标签: c++ boost compilation mysql++

c:\program files\microsoft visual studio 9.0\vc\include\result.h(212) : warning C4275: non dll-interface class 'std::_Container_base_aux' used as base for dll-interface class 'std::_Container_base_aux_alloc_real<_Alloc>'
1>        with
1>        [
1>            _Alloc=std::allocator<mysqlpp::Row>
1>        ]
1>        C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xutility(377) : see declaration of 'std::_Container_base_aux'

是否可能导致与容器相关的任何问题,或者可以在Visual Studio 2008中安全地忽略它?

1 个答案:

答案 0 :(得分:2)

在这种情况下,我认为它取决于std :: runtime_error。对于客户端使用此类,它必须使用客户端提供的定义,而不是DLL端。为此,客户端编译器应该与DLL编译器完全相同。

除了类定义不能跨模块边界移植外,还需要考虑内存所有权。

如果你从一个具有内部变量(如std :: string)的类派生,那么等待发生的灾难就会发生。如果dll将使用与另一个类派生的应用程序不同的运行时,则可能发生以下情况:

  • Base使用文本值初始化字符串。
  • Derived会尝试更改字符串。
  • 它会尝试释放字符串的堆内存。

当然,这不仅限于字符串。这只是一个例子。任何情况下,1运行时分配一些东西,另一个运行时解除分配它将导致崩溃。

堆内存由基类使用的运行时拥有。派生类的运行时尝试释放它 - &gt;即时崩溃。您将受到dll提供程序的支配,以便为您提供使用相同C ++编译器编译的dll,并使用相同的运行时。这是一场维护噩梦。

DLL类接口毫无疑问是最糟糕的想法。

唯一的两项豁免是:

  • 你使用DCOM(或纯抽象类,这是相同的想法)
  • 您可以控制整个代码树。例如,dll和exe都是在同一个解决方案中构建的。

在所有其他情况下,DLL类接口都支持噩梦,等待发生灾难。

我认为this thread 可能会建议你一个解决方案。

如果使用相同的编译器编译所有内容并使用/MD,请随意忽略C4275,以便所有模块共享相同的运行时。