Определения и объявления (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.
}
Завершение блока, относящегося только к системам Майкрософт
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по