Spec-Zone.ru › GCC 13 CPP

7 Директивы

Директива ‘#pragma’ — это метод, определённый стандартом C для предоставления компилятору дополнительной информации, помимо той, что содержится в самом языке. Формы этой директивы (обычно называемые директивами), определённые стандартом C, имеют префикс STDC. Компилятор C свободен в придании любого значения другим директивам. Большинство директив, определённых и поддерживаемых GNU, имеют префикс GCC.

C99 ввёл оператор _Pragma. Эта функция решает главную проблему с ‘#pragma’: будучи директивой, она не может быть получена в результате подстановки макросов. _Pragma — это оператор, подобный sizeof или defined, и может быть вложен в макрос.

Его синтаксис — _Pragma (string-literal), где строковая константа может быть обычной или широкой строковой константой. Она дестрозируется, заменяя все ‘\\’ на один ‘\’ и все ‘\"’ на ‘"’. Результат затем обрабатывается так, как будто он был правой частью директивы ‘#pragma’. Например,

_Pragma ("GCC dependency \"parse.y\"")

имеет тот же эффект, что и #pragma GCC dependency "parse.y". Тот же эффект можно достичь с помощью макросов, например

#define DO_PRAGMA(x) _Pragma (#x)
DO_PRAGMA (GCC dependency "parse.y")

Стандарт не уточняет, где может появиться оператор _Pragma. Предпроцессор не принимает его внутри директивы предварительного условия, такой как ‘#if’. Для безопасности лучше всего его не использовать в других директивах, кроме ‘#define’, и размещать его на отдельной строке.

Этот справочник документирует директивы, имеющие смысл для самого предпроцессора. Другие директивы имеют смысл для компиляторов C или C++. Они документированы в руководстве по GCC.

Плагины GCC могут предоставлять свои собственные директивы.

#pragma GCC dependency

#pragma GCC dependency позволяет проверить относительные даты текущего файла и другого файла. Если другой файл более новый, чем текущий, выводится предупреждение. Это полезно, если текущий файл получен из другого файла и должен быть сгенерирован заново. Другой файл ищется с помощью обычного пути поиска включений. Дополнительный текст в конце может использоваться для добавления дополнительной информации в сообщение об ошибке.

#pragma GCC dependency "parse.y"
#pragma GCC dependency "/usr/include/time.h" rerun fixincludes
#pragma GCC poison

Иногда требуется удалить идентификатор из программы, чтобы он больше не появлялся. Для этого можно отравиться идентификатором с помощью этой директивы. #pragma GCC poison за которым следует список идентификаторов для отравления. Если любой из этих идентификаторов появляется где-либо в исходном коде после директивы, возникает жёсткая ошибка. Например,

#pragma GCC poison printf sprintf fprintf
sprintf(some_string, "hello");

вызовет ошибку.

Если отравленный идентификатор появляется как часть расширения макроса, который был определён до отравления идентификатора, ошибка не возникает. Это позволяет отравиться идентификатору, не беспокоясь о системных заголовках, определяющих макросы, использующие его.

Например,

#define strrchr rindex
#pragma GCC poison rindex
strrchr(some_string, 'h');

не вызовет ошибку.

#pragma GCC system_header

Эта директива не принимает аргументов. Она заставляет остальную часть кода в текущем файле обрабатываться так, как будто она взята из системного заголовка. См. Системные заголовки.

#pragma GCC warning
#pragma GCC error

#pragma GCC warning "message" заставляет предпроцессор выдать диагностическое предупреждение с текстом ‘сообщение’. Сообщение, содержащееся в директиве, должно быть единственной строковой константой. Аналогично, #pragma GCC error "message" выводит сообщение об ошибке. В отличие от директив ‘#warning’ и ‘#error’, эти директивы могут быть вложены в макросы предпроцессора с помощью ‘_Pragma’.

#pragma once

Если #pragma once встретится при сканировании заголовочного файла, этот файл больше никогда не будет прочитан, независимо от чего. Это менее портативная альтернатива использованию ‘#ifndef’ для защиты содержимого заголовочных файлов от множественного включения.

#pragma region {tokens}...
#pragma endregion {tokens}...

Эти директивы принимаются, но не оказывают никакого эффекта.

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-13.3.0/cpp/Pragmas.html

Spec-Zone.ru

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