Spec-Zone.ru › GCC 11 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’ для защиты содержимого заголовочных файлов от многократного включения.

Далее: Другие директивы, Предыдущее: Управление строками [Оглавление][Индекс]

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

Spec-Zone.ru

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