0

この場合、 C4251警告を無視できますか? 実際には、ライブラリとライブラリを使用するプログラムのライブラリコンパイル設定が異なると、いくつかのエラーが発生する可能性があります。次に例を示します。

dll.h

 #include <iostream>
    #include <string>

    using namespace std;

    class __declspec(dllexport) HelloWorld
    {
    public:
    #ifdef DTEST
      int test;
    #endif
      HelloWorld();

    };

dll.cpp

#include "dll.h"

HelloWorld::HelloWorld()
{
#ifdef DTEST
    test=0;
#endif
}

exe.cpp

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

int main(void)
{
  HelloWorld myworld;

  return 0;
}

dll.h と dll.cpp をコンパイルして、DTEST の定義で dll.lib と dll.dll を作成しますが、DTEST の定義なしで exe.cpp をコンパイルするとします。ランタイム チェックの失敗 #2 エラーが発生します。このエラーが発生した理由を説明できる人もいます。ありがとう!

4

2 に答える 2

2

DTESTはプリプロセッサ マクロであり、プログラムのすべての部分に対して一貫して定義していないため、このエラーが発生します。コードが実際のコンパイラに到達するまでに完全に削除されるため、コンパイラは問題を検出しません。DTESTfor を定義して forを定義しdll.cppない場合exe.cppexe.cppコンパイラには次のように表示されます。

(...contents of <iostream>...)
(...contents of <string>...)

using namespace std;

class __declspec(dllexport) HelloWorld
{
public:
  HelloWorld();

};

(...contents of <iostream> again...)
using namespace std;

int main(void)
{
  HelloWorld myworld;

  return 0;
}

ただし、次のdll.cppようになります。

(...contents of <iostream>...)
(...contents of <string>...)

using namespace std;

class __declspec(dllexport) HelloWorld
{
public:
  int test;
  HelloWorld();

};

HelloWorld::HelloWorld()
{
    test=0;
}

ここでの問題は、何が何であるかについて 2 つの異なる考えを持ってdll.cppいることです。この不一致をキャッチする実行時チェックがあり、これが表示されています。exe.cppHelloWorlddll.cpptestexe.cpp

于 2013-05-03T17:05:54.230 に答える
1

コンパイラが認識するのは、プリプロセッサ展開の結果です。あなたの例では、コンパイラは次のように表示します。

class HelloWorld
{
public:
    int test;
    HelloWorld();
};

dll.cppおよび

class HelloWorld
{
public:
    HelloWorld();
};

exe.cpp。同じクラス、2 つの異なる定義。これは 1 つの定義規則に違反しており、未定義の動作が発生します。

これは C4251 警告とは何の関係もありません (私が正しく理解していれば、異なる DLL 間のリンクにのみ関係します)。

于 2013-05-03T17:01:11.060 に答える