Spec-Zone.ru › GCC 11

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

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

Spec-Zone.ru

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