Definitionen und Deklarationen (C++)
Microsoft-spezifisch
Die DLL-Schnittstelle bezieht sich auf alle Elemente an (Funktionen und Daten bekannt ist, dass) durch ein Programm im System exportiert werden. das heißt, alle Elemente, die als dllimport oder dllexportdeklariert werden.Alle Deklarationen, die in der DLL-Schnittstelle eingeschlossen sind, müssen entweder dllimport oder dllexport-Attribut angeben.Die Definition muss jedoch nur das dllexport-Attribut angeben.Beispielsweise generiert die folgenden Funktionsdefinition einen Compilerfehler:
__declspec( dllimport ) int func() { // Error; dllimport
// prohibited on definition.
return 1;
}
Dieser Code generiert außerdem einen Fehler:
#define DllImport __declspec( dllimport )
__declspec( dllimport ) int i = 10; // Error; this is a
// definition.
Dies ist jedoch richtige Syntax:
__declspec( dllexport ) int i = 10; // Okay--export definition
Die Verwendung von dllexport bedeutet, eine Definition, während dllimport eine Deklaration impliziert.Sie müssen das externdllexport-Schlüsselwort verwenden, um eine Deklaration zu erzwingen. Andernfalls wird eine Definition impliziert.Daher sind die folgenden Beispiele: korrekt
#define DllImport __declspec( dllimport )
#define DllExport __declspec( dllexport )
extern DllImport int k; // These are both correct and imply a
DllImport int j; // declaration.
In den folgenden Beispielen wird das Vorausgehen:
static __declspec( dllimport ) int l; // Error; not declared extern.
void func() {
static __declspec( dllimport ) int s; // Error; not declared
// extern.
__declspec( dllimport ) int m; // Okay; this is a
// declaration.
__declspec( dllexport ) int n; // Error; implies external
// definition in local scope.
extern __declspec( dllimport ) int i; // Okay; this is a
// declaration.
extern __declspec( dllexport ) int k; // Okay; extern implies
// declaration.
__declspec( dllexport ) int x = 5; // Error; implies external
// definition in local scope.
}