2

here で説明されているように、コードをコンパイルするときに C4251 警告が表示される理由を理解しています。私の質問は、アクセス可能なエクスポート クラス メンバーが STL からのものである場合、C4251 警告を無視できますか? 私の質問を説明するために簡単な例を挙げます。

dll.h

#include <iostream>
#include <string>

using namespace std;

class __declspec(dllexport) HelloWorld
{
public:
  string name;
  HelloWorld();
  HelloWorld(const string &str);

};

dll.cpp

#include "dll.h"

HelloWorld::HelloWorld()
{
  name ="";
}
HelloWorld::HelloWorld(const string &str)
{ 
 name = str;
}

私が取得した警告情報は次のとおりです。

Warning 1   warning C4251: 'HelloWorld::name' : class 'std::basic_string<_Elem,_Traits,_Ax>' needs to have dll-interface to be used by clients of class 'HelloWorld'    *\dll.h 9

私の質問は、この警告を無視できますか? このライブラリの使用方法も非常に簡単です。

#include "dll.h"
#include <iostream>
using namespace std;

int main(void)
{
  HelloWorld myworld;
  myworld.name = "Tom's world";
  cout<<myworld.name<<endl;
  return 0;
}
4

2 に答える 2

6

DLL インターフェイスで標準 C++ ライブラリの実装の詳細を公開するには、標準 C++ ライブラリの実装方法がコンパイラの過去および将来の各バージョンと互換性があり、今後も維持されることを、コンパイラ ベンダーから保証する必要があります。 ) を使用する予定です。そうしないと、後で非常にあいまいなクラッシュが発生する危険があります。

この特定のベンダーは、これらの互換性保証の範囲について非常に明確です。

標準 C++ ライブラリの型から派生し、デバッグ リリース (/MTd) をコンパイルし、コンパイラ エラー メッセージが _Container_base を参照している場合、C4251 は無視できます。

背景の詳細​​については、この投稿を参照してください。

したがって、答えは「いいえ」です。今日うまくいっても、明日には壊れるかもしれません。

この状況は、ある DLL でメモリを割り当て、別の DLL で解放するなどの不正行為に似ています。

DLL とそのすべてのクライアントがまったく同じコンパイラ リビジョンとコンパイル設定を使用してコンパイルされていて、作業ルーチンでデバッグ バイナリとリリース バイナリを混在させていない場合、差し迫ったリスクや破損はほぼゼロです。しかし、そのような危険な設計の習慣は、DLL のバイナリの再利用性に反し、非自明で高価な方法で将来を制限する可能性があります。コンパイラによって警告されていると感じ続けることは、実際に限界を超えることに対してできる最小限のことです。

于 2013-05-03T15:41:59.947 に答える