7 Директивы #pragma
Директива ‘#pragma’ — это метод, определённый стандартом C для предоставления компилятору дополнительной информации, выходящей за рамки языка. Формы этой директивы (обычно называемые директивами), определённые стандартом C, начинаются с STDC. Компилятор C может произвольно трактовать другие директивы #pragma. Большинство определённых и поддерживаемых GNU директивы #pragma начинаются с 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’, и размещать его на отдельной строке.
В данном руководстве описываются директивы #pragma, имеющие смысл для самого препроцессора. Другие директивы #pragma имеют смысл для компиляторов C или C++. Они документированы в руководстве GCC.
Плагины GCC могут предоставлять свои собственные директивы #pragma.
-
#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-12.1.0/cpp/Pragmas.html