6.4.1 Объявление атрибутов функций
В GNU C и C++ можно использовать атрибуты функций для указания определённых свойств функций, которые могут помочь компилятору оптимизировать вызовы или тщательнее проверять корректность кода. Например, с помощью атрибутов можно указать, что функция никогда не возвращает управление (noreturn), возвращает значение, зависящее только от значений её аргументов (const), или имеет аргументы в стиле printf (format).
Также можно использовать атрибуты для управления размещением в памяти, параметрами генерации кода или соглашениями о вызовах и возврате внутри аннотируемой функции. Многие из этих атрибутов зависят от целевой платформы. Например, многие целевые платформы поддерживают атрибуты для определения функций-обработчиков прерываний, которые обычно должны соблюдать специальные соглашения об использовании регистров и возврате. Такие атрибуты описаны в подразделе для каждой целевой платформы. Однако значительное число атрибутов поддерживается большинством, если не всеми, целевыми платформами. Они описаны в разделе Общие атрибуты функций.
GCC предоставляет два способа задания атрибутов: традиционный синтаксис GNU с аннотациями ‘__attribute__ ((...))’ и более новый стандартный синтаксис C и C++ с использованием ‘[[...]]’ и префикса ‘gnu::’ в именах атрибутов. Обратите внимание: точные правила размещения атрибутов в исходном коде различаются в зависимости от используемого синтаксиса. Подробности см. в разделе Синтаксис атрибутов.
Совместимые спецификации атрибутов в отдельных объявлениях одной и той же функции объединяются. Спецификация атрибута, несовместимая с атрибутами, уже применёнными к объявлению той же функции, игнорируется с выдачей предупреждения.
Некоторые атрибуты функций принимают один или несколько аргументов, указывающих на параметры функции по их позициям в списке параметров. Такие аргументы атрибутов называются позиционными аргументами. Если не указано иное, позиционные аргументы, задающие свойства параметров с типами-указателями, могут также задавать те же свойства неявного аргумента C++ this в нестатических функциях-членах и параметров со ссылкой на тип-указатель. Для обычных функций позиция один соответствует первому параметру в списке. В нестатических функциях-членах 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
- Атрибуты функций LoongArch
- Атрибуты функций M32C
- Атрибуты функций M32R/D
- Атрибуты функций m68k
- Атрибуты функций MCORE
- Атрибуты функций MicroBlaze
- Атрибуты функций Microsoft Windows
- Атрибуты функций MIPS
- Атрибуты функций MSP430
- Атрибуты функций NDS32
- Атрибуты функций 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-15.3.0/gcc/Function-Attributes.html