7.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путём указания относительного приоритета, целочисленного константного выражения, в настоящее время ограниченного значениями от 101 до 65535 включительно. Более низкие числа означают более высокий приоритет.В следующем примере,
Aобычно создаётся доB, но атрибутinit_priorityизменяет этот порядок:Some_Class A __attribute__ ((init_priority (2000))); Some_Class B __attribute__ ((init_priority (543)));
Обратите внимание, что конкретные значения приоритета не имеют значения; важно только их относительное упорядочение.
-
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-14.2.0/gcc/C_002b_002b-Attributes.html