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-10.5.0/cpp/Pragmas.html