6.33.20 Атрибуты функций 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-11.4.0/gcc/Microsoft-Windows-Function-Attributes.html