Freigeben über


Definitionen und Deklarationen (C++)

Microsoft-spezifisch

Die DLL-Schnittstelle bezieht sich auf alle Elemente (Funktionen und Daten), von denen bekannt ist, dass sie von einem Programm im System exportiert werden, also alle als dllimport oder dllexport deklarierten Elemente. Bei allen Deklarationen, auf die sich die DLL-Schnittstelle bezieht, muss entweder das dllimport - oder das dllexport-Attribut angegeben sein. Die Definition darf jedoch nur das dllexport Attribut angeben. Beispielsweise verursacht die folgende Funktionsdefinition einen Compilerfehler:

__declspec( dllimport ) int func() {   // Error; dllimport
                                       // prohibited on definition.
   return 1;
}

Dieser Code generiert außerdem einen Fehler:

__declspec( dllimport ) int i = 10;  // Error; this is a definition.

Dies ist jedoch die richtige Syntax:

__declspec( dllexport ) int i = 10;  // Okay--export definition

Die Verwendung von dllexport setzt eine Definition voraus, die von dllimport eine Deklaration. Sie müssen das extern-Schlüsselwort mit dllexport verwenden, um eine Deklaration zu erzwingen; andernfalls wird eine Definition impliziert. Daher sind die folgenden Beispiele richtig:

#define DllImport   __declspec( dllimport )
#define DllExport   __declspec( dllexport )

extern DllExport int k; // These are both correct and imply a
DllImport int j;        // declaration.

Das vorherige Beispiel wird anhand der folgenden Beispiele verdeutlicht:

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.
}

Ende Microsoft-spezifisch

Siehe auch

dllexport, dllimport