6.4.1.19 Атрибуты функций 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++ атрибут помечает невстроенные функции-члены и статические члены данных как импортируемые. Однако атрибут игнорируется для виртуальных методов, чтобы можно было создавать таблицы виртуальных методов с использованием thunk-функций.
Для целевой платформы SH Symbian OS атрибут
dllimportтакже имеет дополнительный эффект — он может привести к экспорту таблицы виртуальных методов и информации о типах времени выполнения для класса. Это происходит, когда у класса есть конструктор, импортируемый с помощью dllimport, или невстроенная непустая виртуальная функция и, при выполнении любого из этих двух условий, у класса также есть встроенный конструктор или деструктор, а ключевая функция определена в текущей единице трансляции.Для целевых платформ Microsoft Windows использовать атрибут
dllimportдля функций необязательно, однако это дает небольшое преимущество в производительности за счет устранения thunk-функции в DLL. Использования атрибутаdllimportдля импортируемых переменных можно избежать, передав компоновщику GNU параметр --enable-auto-import. Как и в случае с функциями, использование атрибута для переменной устраняет thunk-функцию в DLL.Недостаток этого атрибута заключается в том, что указатель на переменную, помеченную как
dllimport, нельзя использовать в качестве константного адреса. Однако указатель на функцию с атрибутомdllimportможно использовать в качестве константного инициализатора; в этом случае используется адрес stub-функции из библиотеки импорта. Для целевых платформ Microsoft Windows атрибут можно отключить для функций, задав флаг -mnop-fun-dllimport.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/Microsoft-Windows-Function-Attributes.html