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 нет конструкторов или деструкторов.
Далее: Многоверсионность функций, Предыдущее: Связанные члены функций, Наверх: Расширения C++ [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/C_002b_002b-Attributes.html