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