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)));
Обратите внимание, что конкретные значения приоритета не важны; важен только их относительный порядок.
java_interface-
Этот атрибут типа сообщает C++, что класс является Java-интерфейсом. Он может быть применён только к классам, объявленным внутри блока
extern "Java". Вызовы методов, объявленных в этом интерфейсе, обрабатываются механизмом таблицы интерфейсов GCJ, а не стандартной диспатчеризацией виртуальных таблиц. 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-6.5.0/gcc/C_002b_002b-Attributes.html