Spec-Zone.ru › GCC 5

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::mutex.

Этот атрибут также принимается в C, но он не нужен, потому что в C нет конструкторов или деструкторов.

См. также Ассоциация пространств имён.

Далее: Мультиверсионность функций, Предыдущее: Связанные члены функций, Вверх: Расширения C++ [Оглавление][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-5.5.0/gcc/C_002b_002b-Attributes.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API