6.33.18 Атрибуты функций Microsoft Windows
Следующие атрибуты доступны для платформ Microsoft Windows и Symbian OS.
-
dllexport -
На платформах Microsoft Windows и Symbian OS атрибут
dllexportзаставляет компилятор создать глобальный указатель на указатель в DLL, чтобы его можно было использовать с атрибутомdllimport. На платформах Microsoft Windows имя указателя формируется путем объединения_imp__и имени функции или переменной.Для совместимости с другими компиляторами можно использовать
__declspec(dllexport)как синоним для__attribute__ ((dllexport)).На системах, поддерживающих атрибут
visibility, этот атрибут также подразумевает «по умолчанию» видимость. Явное указание любой другой видимости является ошибкой.По умолчанию GCC генерирует все встроенные функции с атрибутом
dllexport. Поскольку это может привести к увеличению размера объектных файлов, можно использовать -fno-keep-inline-dllexport, который указывает GCC игнорировать этот атрибут для встроенных функций, если не используется флаг -fkeep-inline-functions.Атрибут игнорируется для неопределённых символов.
При применении к классам C++, атрибут отмечает определённые, не встроенные, члены функций и статические данные как экспортируемые. Статические константы, инициализированные внутри класса, не отмечаются, если они не определены вне класса.
Для платформ Microsoft Windows существуют альтернативные методы включения символа в таблицу экспорта DLL, такие как использование файла .def с секцией
EXPORTSили, с GNU ld, использование флага линковщика --export-all. -
dllimport -
На платформах Microsoft Windows и Symbian OS, атрибут
dllimportзаставляет компилятор обращаться к функции или переменной через глобальный указатель на указатель, который настраивается DLL, экспортирующей символ. Атрибут подразумеваетextern. На платформах Microsoft Windows имя указателя формируется путем объединения_imp__и имени функции или переменной.Для совместимости с другими компиляторами можно использовать
__declspec(dllimport)как синоним для__attribute__ ((dllimport)).На системах, поддерживающих атрибут
visibility, этот атрибут также подразумевает «по умолчанию» видимость. Явное указание любой другой видимости является ошибкой.В настоящее время атрибут игнорируется для встроенных функций. Если атрибут применяется к определению символа, выдаётся ошибка. Если символ, ранее объявленный
dllimport, позже определён, атрибут игнорируется при последующих ссылках и выводится предупреждение. Атрибут также переопределяется последующим объявлением какdllexport.При применении к классам C++, атрибут отмечает не встроенные члены функций и статические члены данных как импортируемые. Однако атрибут игнорируется для виртуальных методов, чтобы позволить создание vtable с использованием тханков.
На целевой платформе SH Symbian OS атрибут
dllimportтакже оказывает другое влияние — он может привести к экспорту vtable и информации о типе времени выполнения для класса. Это происходит, когда у класса есть конструктор dllimported или не встроенная, не чистая виртуальная функция, и при любом из этих двух условий у класса также есть встроенный конструктор или деструктор и ключевая функция, определённая в текущей единице трансляции.Для платформ Microsoft Windows использование атрибута
dllimportдля функций необязательно, но обеспечивает небольшую производительность, исключая тхэнку в DLL. Использование атрибутаdllimportдля импортируемых переменных можно избежать, передав переключатель --enable-auto-import линковщику GNU. Как и для функций, использование атрибута для переменной исключает тхэнку в DLL.Одним из недостатков использования этого атрибута является то, что указатель на переменную, помеченную как
dllimport, не может быть использован как постоянный адрес. Однако указатель на функцию с атрибутомdllimportможет использоваться как константная инициализация; в этом случае ссылается на адрес служебной функции в импортной библиотеке. На платформах Microsoft Windows атрибут можно отключить для функций, установив флаг -mnop-fun-dllimport.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-13.3.0/gcc/Microsoft-Windows-Function-Attributes.html