Udostępnij za pośrednictwem


Definicje i deklaracje (C++)

Specyficzne dla firmy Microsoft

Interfejs biblioteki DLL odwołuje się do wszystkich elementów (funkcji i danych), o których wiadomo, że są eksportowane przez pewien program w systemie; są to wszystkie elementy, które zostały zadeklarowane jako dllimport lub dllexport.Wszystkie deklaracje zawarte w interfejsie biblioteki DLL muszą określać atrybut dllimport lub dllexport.Jednakże, definicja musi określać tylko atrybut dllexport.Na przykład, następująca definicja funkcji generuje błąd kompilatora:

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

Ten kod również generuje błąd:

#define DllImport   __declspec( dllimport )

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

Jednakże, jest to poprawna składnia:

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

Użycie dllexport implikuje definicję, podczas gdy dllimport implikuje deklarację.Musisz używać słowa kluczowego extern z dllexport, aby wymusić deklarację; w przeciwnym przypadku implikowana jest definicja.Tak więc następujące przykłady są poprawne:

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

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

Poniższe przykłady wyjaśniają poprzednie:

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

Zobacz też

Informacje

dllexport, dllimport