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