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 irgend einem Programm im System exportiert werden; das heißt, alle Elemente, die als dllimport oder dllexport deklariert werden. Alle Deklarationen, die in der DLL-Schnittstelle eingeschlossen sind, müssen das dllimport- oder das dllexport-Attribut angeben. Allerdings muss die Definition 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:

#define DllImport   __declspec( dllimport )

__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, während dllimport eine Deklaration impliziert. 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 DllImport 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.
}

Siehe auch

Referenz

dllexport, dllimport