Udostępnij przez


Ostrzeżenie kompilatora (poziom 2) C4275

nie - klasa interfejsu DLL "class_1" używana jako podstawa dla klasy interfejsu DLL "class_2"

Uwagi

Wyeksportowana klasa pochodzi z klasy, która nie została wyeksportowana.

Aby zminimalizować możliwość uszkodzenia danych podczas eksportowania klasy z __declspec(dllexport), upewnij się, że:

  • Dostęp do wszystkich danych statycznych jest uzyskiwany za pośrednictwem funkcji eksportowanych z biblioteki DLL.

  • Żadne wbudowane metody klasy nie mogą modyfikować danych statycznych.

  • Żadna ze wbudowanych metod klasy nie używa funkcji CRT ani innych funkcji bibliotek, które używają danych statycznych.

  • Żadne wbudowane funkcje klas nie używają funkcji CRT ani innych funkcji biblioteki, w których uzyskujesz dostęp do danych statycznych.

  • Metody klasy (niezależnie od inliningu) nie mogą używać typów, w których wystąpienie pliku EXE i biblioteki DLL ma różnice w danych statycznych.

Można uniknąć eksportowania klas, definiując bibliotekę DLL, która definiuje klasę z funkcjami wirtualnymi, oraz funkcje, które można wywołać w celu utworzenia wystąpienia i usunięcia obiektów typu. Następnie możesz po prostu wywołać funkcje wirtualne w typie.

C4275 można zignorować w języku Visual C++, jeśli pochodzisz z typu w standardowej bibliotece języka C++, kompilując wydanie debugowania (/MTd) i gdzie komunikat o błędzie kompilatora odwołuje się do _Container_base.

Example

Poniższy przykład generuje C4275:

// C4275.cpp
// compile with: /EHsc /MTd /W2 /c
#include <vector>
using namespace std;
class Node;
class __declspec(dllimport) VecWrapper : vector<Node *> {};   // C4275