Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
'Typ': 'Typ1' muss eine DLL-Schnittstelle haben, um von Clients von 'Typ2' verwendet zu werden.
Hinweise
Diese Warnung tritt auf, wenn eine Klasse mit __declspec(dllexport) oder __declspec(dllimport) und einem nicht statischen Datenmember gekennzeichnet ist, der ein Mitglied der Klasse oder einer seiner Basisklassen ist, und einen Typ aufweist, der ein nicht mit __declspec(dllexport) oder __declspec(dllimport) markierter Klassentyp ist. Siehe Beispiel.
Um die Möglichkeit einer Datenbeschädigung beim Exportieren einer Klasse zu minimieren, die als __declspec(dllexport) deklariert wurde, stellen Sie Folgendes sicher:
- Auf alle statischen Daten wird über Funktionen zugegriffen, die aus der DLL exportiert werden.
- Keine Inline-Methoden Ihrer Klasse können statische Daten ändern.
- Keine Inline-Methoden Ihrer Klasse verwenden CRT-Funktionen oder andere Bibliotheksfunktionen, die statische Daten verwenden. Weitere Informationen finden Sie unter Potenzielle Fehler bei der Übergabe von CRT-Objekten über DLL-Grenzen.
- Keine Methoden Ihrer Klasse (ob inline oder nicht) können Typen verwenden, bei denen die Instanziierung in der EXE und DLL statische Datenunterschiede aufweisen.
Sie können Probleme beim Exportieren einer Klasse aus einer DLL vermeiden, indem Sie:
- Ihre Klasse mit virtuellen Funktionen definieren.
- Einen virtuellen Destruktor definieren.
- Funktionen zum Instanziieren und Löschen von Instanzen des Typs definieren.
Sie können C4251 ignorieren, wenn Ihre Klasse von einem Typ in der C++-Standardbibliothek abgeleitet ist, Sie eine Debugversion kompilieren (/MTd) und die Compilerfehlermeldung sich auf _Container_base bezieht.
Denken Sie sorgfältig darüber nach, __declspec(dllexport) oder __declspec(dllimport) zu einer Klasse hinzuzufügen, da es fast immer die falsche Entscheidung ist, und es die Wartung erschweren kann, da die Änderung der Implementierungsdetails schwieriger wird.
Beispiel
Im folgenden Beispiel wird C4251 generiert:
// C4251.cpp
// Compile with /std:c++20 /EHsc /W2 /c C4251.cpp
#include <vector>
class __declspec(dllexport) X
{
public:
X();
~X();
void do_something();
private:
void do_something_else();
std::vector<int> data; // warning c4251
};
Um diese Warnung zu beheben, markieren Sie die Klasse nicht mit __declspec(dllexport) oder __declspec(dllimport). Markieren Sie stattdessen nur die Methoden, die direkt von einem Client verwendet werden. Zum Beispiel:
// C4251_fixed.cpp
// Compile with /std:c++20 /EHsc /W2 /c C4251-fixed.cpp
#include <vector>
class X
{
public:
__declspec(dllexport) X();
__declspec(dllexport) ~X();
__declspec(dllexport) void do_something();
private:
void do_something_else();
std::vector<int> data;
};