Sdílet prostřednictvím


Upozornění kompilátoru (úroveň 2) C4275

non - DLL-interface třída 'class_1' použitá jako základ pro třídu rozhraní DLL 'class_2'

Exportovaná třída byla odvozena z třídy, která nebyla exportována.

Chcete-li minimalizovat možnost poškození dat při exportu třídy s __declspec(dllexport), ujistěte se, že:

  • Všechna statická data jsou přístupná prostřednictvím funkcí, které jsou exportovány z knihovny DLL.

  • Statické data nemohou upravovat žádné vložené metody vaší třídy.

  • Žádné vložené metody vaší třídy používají funkce CRT nebo jiné funkce knihovny, které používají statická data.

  • Žádné vložené funkce třídy nepoužívají funkce CRT ani jiné funkce knihovny, kde přistupujete ke statickým datům.

  • Žádné metody vaší třídy (bez ohledu na vkládání) mohou používat typy, ve kterých instance v exe a DLL mají statické rozdíly dat.

Vyhnete se exportu tříd definováním knihovny DLL, která definuje třídu s virtuálními funkcemi, a funkce můžete volat vytvoření instance a odstranění objektů typu. Pak můžete jednoduše volat virtuální funkce typu.

C4275 lze v jazyce Visual C++ ignorovat, pokud pocházíte z typu ve standardní knihovně jazyka C++, kompilujete ladicí verzi (/MTd) a kde chybová zpráva kompilátoru odkazuje _Container_basena .

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