Spec-Zone.ru › GCC 15

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API