6.33 Объявление атрибутов функций
В GNU C и C++, вы можете использовать атрибуты функций для указания определённых свойств функций, которые могут помочь компилятору оптимизировать вызовы или более тщательно проверять код на правильность. Например, вы можете использовать атрибуты для указания того, что функция никогда не возвращает (noreturn), возвращает значение, зависящее только от значений её аргументов (const), или имеет printf-стиль аргументов (format).
Вы также можете использовать атрибуты для управления размещением памяти, опциями генерации кода или соглашениями о вызове/возвращении внутри аннотируемой функции. Многие из этих атрибутов зависят от целевой платформы. Например, многие целевые платформы поддерживают атрибуты для определения функций обработчиков прерываний, которые обычно должны следовать специальным соглашениям об использовании регистров и возвращении. Такие атрибуты описываются в подразделе для каждой целевой платформы. Однако значительное количество атрибутов поддерживается большинством, если не всеми, целевыми платформами. Они описаны в разделе Общие атрибуты функций.
Атрибуты функций вводятся с помощью ключевого слова __attribute__ в объявлении функции, за которым следует спецификация атрибута, заключенная в двойные скобки. Вы можете указать несколько атрибутов в объявлении, разделяя их запятыми внутри двойных скобок или сразу следуя за одной спецификацией атрибута другой. См. Синтаксис атрибутов для точных правил синтаксиса и размещения атрибутов. Совместимые спецификации атрибутов в различных объявлениях одной и той же функции объединяются. Спецификация атрибута, несовместимая с атрибутами, уже применёнными к объявлению той же функции, игнорируется с предупреждением.
Некоторые атрибуты функций принимают один или несколько аргументов, которые ссылаются на параметры функции по их позициям в списке параметров функции. Такие аргументы атрибутов называются позиционными аргументами. Если не указано иное, позиционные аргументы, которые задают свойства параметров с типами указателей, также могут указывать те же свойства нестатического члена функции в C++, и параметров типа ссылки на указатель. Для обычных функций позиция один относится к первому параметру в списке. В нестатических функциях-членах C++ позиция один относится к неявном указателю this. Те же ограничения и эффекты применяются к атрибутам функций, используемым с обычными функциями или функциями-членами C++.
GCC также поддерживает атрибуты в объявлениях переменных (см. Указание атрибутов переменных), метках (см. Атрибуты меток), перечислениях (см. Атрибуты перечислений), операторах (см. Атрибуты операторов), типах (см. Указание атрибутов типов) и в объявлениях полей (для tainted_args).
Существует некоторое перекрытие между целями атрибутов и директив (см. Директивы, принимаемые GCC). Оказалось удобным использовать __attribute__ для естественного присоединения атрибутов к соответствующим объявлениям, тогда как #pragma полезно для совместимости с другими компиляторами или конструкциями, которые не являются естественной частью грамматики.
Помимо описанных здесь атрибутов, плагины GCC могут предоставлять свои собственные атрибуты.
- Общие атрибуты функций
- Атрибуты функций AArch64
- Атрибуты функций AMD GCN
- Атрибуты функций ARC
- Атрибуты функций ARM
- Атрибуты функций AVR
- Атрибуты функций Blackfin
- Атрибуты функций BPF
- Атрибуты функций C-SKY
- Атрибуты функций Epiphany
- Атрибуты функций H8/300
- Атрибуты функций IA-64
- Атрибуты функций M32C
- Атрибуты функций M32R/D
- Атрибуты функций m68k
- Атрибуты функций MCORE
- Атрибуты функций MicroBlaze
- Атрибуты функций Microsoft Windows
- Атрибуты функций MIPS
- Атрибуты функций MSP430
- Атрибуты функций NDS32
- Атрибуты функций Nios II
- Атрибуты функций Nvidia PTX
- Атрибуты функций PowerPC
- Атрибуты функций RISC-V
- Атрибуты функций RL78
- Атрибуты функций RX
- Атрибуты функций S/390
- Атрибуты функций SH
- Атрибуты функций Symbian OS
- Атрибуты функций V850
- Атрибуты функций Visium
- Атрибуты функций x86
- Атрибуты функций Xstormy16
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-13.3.0/gcc/Function-Attributes.html