8.7 Атрибуты переменных, функций и типов, специфичные для C++
Некоторые атрибуты имеют смысл только для программ на C++.
-
abi_tag ("tag", ...) -
Атрибут
abi_tagможно применять к объявлению функции, переменной или класса. Он изменяет искажённое имя сущности, включая в него имя тега, чтобы отличать функцию или класс от более ранней версии с другим ABI; возможно, изменился размер класса или функция стала возвращать тип, который не кодируется в искажённом имени.Атрибут также можно применять к встроенному пространству имён, но он не влияет на искажённое имя пространства имён; в этом случае он используется только для предупреждений -Wabi-tag и автоматической маркировки функций и переменных. Обычно предпочтительнее маркировать встроенные пространства имён, а не отдельные объявления, однако иногда необходимо поступить иначе, например, когда маркировать нужно только некоторые члены класса.
Аргументом может быть список строк произвольной длины. При выводе строки сортируются, поэтому порядок элементов списка не имеет значения.
Повторное объявление сущности не должно добавлять новые теги ABI, поскольку это изменило бы искажённое имя.
Теги ABI применяются к имени, поэтому все создания экземпляров и специализации шаблона имеют одинаковые теги. Атрибут игнорируется, если применён к явной специализации или созданию экземпляра.
Флаг -Wabi-tag включает предупреждение о классе, у которого отсутствуют некоторые теги ABI, используемые его подобъектами и виртуальными функциями; для пользователей, чьему коду необходимо сосуществовать с более ранней версией ABI, этот параметр помогает найти все затронутые типы, которые нужно маркировать.
Если тип с тегом ABI используется как тип переменной или возвращаемый тип функции, а этот тег ещё не присутствует в сигнатуре функции, тег автоматически применяется к переменной или функции. Параметр -Wabi-tag также предупреждает об этой ситуации; этого предупреждения можно избежать, явно пометив переменную или функцию либо переместив её во встроенное пространство имён с тегом.
-
init_priority (priority) -
Согласно стандарту C++, гарантируется, что объекты, определённые на уровне пространства имён, инициализируются в строгом соответствии с порядком их определений в пределах данной единицы трансляции. Порядок инициализации в разных единицах трансляции не гарантируется. Однако GNU C++ позволяет управлять порядком инициализации объектов, определённых на уровне пространства имён, с помощью атрибута
init_priority, задавая относительный приоритет, имеющий тот же смысл, что и для атрибутаconstructor(см. Общие атрибуты функций).В следующем примере
Aобычно создавался бы передB, но атрибутinit_priorityменяет этот порядок на обратный:Some_Class A __attribute__ ((init_priority (2000))); Some_Class B __attribute__ ((init_priority (543)));
Обратите внимание, что конкретные значения приоритета не имеют значения; важен только их относительный порядок.
Как и в случае аргумента приоритета атрибутов
constructorиdestructor, некоторые целевые платформы не поддерживают атрибутinit_priority. В этом случае атрибут отклоняется с ошибкой, а не игнорируется. -
no_dangling -
Этот атрибут можно применять к типу класса, функции или функции-члену. Для висячих ссылок на классы, помеченные этим атрибутом, диагностика -Wdangling-reference подавляется; то же относится к ссылкам, возвращаемым функциями, помеченными
gnu::no_dangling. Например:class [[gnu::no_dangling]] S { … };Или:
class A { int *p; [[gnu::no_dangling]] int &foo() { return *p; } }; [[gnu::no_dangling]] const int & foo (const int &i) { … }Этот атрибут принимает необязательный аргумент, который должен быть выражением, принимающим значение true или false:
template <typename T> struct [[gnu::no_dangling(std::is_reference_v<T>)]] S { … };Или:
template <typename T> [[gnu::no_dangling(std::is_lvalue_reference_v<T>)]] decltype(auto) foo(T&& t) { … }; -
warn_unused -
Для типов C++ с нетривиальными конструкторами и/или деструкторами компилятор не может определить, действительно ли переменная такого типа не используется, если на неё нет ссылок. Этот атрибут типа сообщает компилятору, что о переменных такого типа следует выдавать предупреждение, если они, по-видимому, не используются, как и о переменных фундаментальных типов.
Этот атрибут подходит для типов, представляющих лишь значение, например
std::string; он не подходит для типов, управляющих ресурсом, напримерstd::lock_guard.Этот атрибут также принимается в C, но он не нужен, поскольку в C нет конструкторов и деструкторов.
-
cold -
Помимо функций и меток, GNU C++ позволяет использовать атрибут
coldдля классов, структур или объединений C++. Применение атрибутаcoldк типу приводит к тому, что все функции-члены этого типа, включая неявные специальные функции-члены, считаются холодными. Если функция-член помечена атрибутом функцииhot, приоритет имеет атрибутhot, а атрибутcoldне распространяется.Описание влияния атрибута
coldна функции см. в разделе Общие атрибуты функций. -
hot -
Помимо функций и меток, GNU C++ позволяет использовать атрибут
hotдля классов, структур или объединений C++. Применение атрибутаhotк типу приводит к тому, что все функции-члены этого типа, включая неявные специальные функции-члены, считаются горячими. Если функция-член помечена атрибутом функцииcold, приоритет имеет атрибутcold, а атрибутhotне распространяется.Описание влияния атрибута
hotна функции см. в разделе Общие атрибуты функций.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/C_002b_002b-Attributes.html