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-10.5.0/gcc/C_002b_002b-Attributes.html