Spec-Zone.ru › GCC 7

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

Spec-Zone.ru

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