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-10.5.0/gcc/Microsoft-Windows-Function-Attributes.html