Определения и объявления (C++)

Блок, относящийся только к системам Майкрософт

Интерфейс DLL относится ко всем элементам (функциям и данным), про которые известно, что некоторая программа в системе будет их экспортировать, т. е. ко всем элементам, объявленным как dllimport или dllexport. Во всех объявлениях, включенных в интерфейс DLL, нужно указать атрибут dllimport или dllexport. Однако определение должно указывать только dllexport атрибут. Например, следующее определение функции вызовет ошибку компилятора.

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

Показанный ниже код также вызовет ошибку.

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

Однако следующий синтаксис правильный.

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

Использование атрибута dllexport подразумевает определение, а dllimport — объявление. Для обеспечения объявления ключевое слово extern следует использовать с dllexport; в противном случае подразумевается определение. Таким образом, приведенные ниже примеры правильны.

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

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

В следующих примерах поясняются предшествующие.

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

Завершение блока, относящегося только к системам Майкрософт

См. также

dllexport, dllimport