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)));
Обратите внимание, что конкретные значения приоритета не имеют значения; имеет значение только их относительный порядок.
-
warn_unused -
Для типов C++ с нетривиальными конструкторами и/или деструкторами компилятор не может определить, является ли переменная этого типа действительно неиспользуемой, если она не ссылается. Этот атрибут типа сообщает компилятору, что переменные этого типа должны вызывать предупреждения, если они кажутся неиспользуемыми, как и переменные фундаментальных типов.
Этот атрибут подходит для типов, которые просто представляют значение, например,
std::string; он не подходит для типов, которые управляют ресурсом, например,std::lock_guard.Этот атрибут также принимается в C, но он не нужен, поскольку в C нет конструкторов или деструкторов.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-13.3.0/gcc/C_002b_002b-Attributes.html