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