7 Директивы
Директива ‘#pragma’ — это метод, определённый стандартом C для предоставления дополнительной информации компилятору помимо той, что передаётся самим языком. Стандарт C 1999 определяет три формы этой директивы (обычно называемые директивами). Компилятор C свободен присваивать любое значение другим директивам.
GCC исторически предпочитал использовать расширения синтаксиса языка, такие как __attribute__, для этой цели. Однако GCC определяет несколько собственных директив. В основном они влияют на весь блок трансляции или файл исходного кода.
В версии GCC 3 все определённые и поддерживаемые GNU директивы получили префикс GCC. Это соответствует префиксу STDC для всех директив, определённых стандартом C99. Для обратной совместимости директивы, которые распознавались предыдущими версиями, по-прежнему распознаются без префикса GCC, но такое использование устарело. Некоторые более старые директивы полностью устарели. Они не распознаются с префиксом GCC. См. Устаревшие возможности.
C99 вводит оператор _Pragma. Эта функция решает главную проблему с ‘#pragma’: будучи директивой, она не может быть результатом подстановки макроса. _Pragma — это оператор, подобный операторам sizeof или defined, и его можно встроить в макрос.
Его синтаксис — _Pragma (строковая_литераль), где строковая_литераль может быть обычной или широкосимвольной строковой литералью. Она дестроизируется путём замены всех ‘\\’ на одну ‘\’ и всех ‘\"’ на ‘"’. Результат затем обрабатывается так, как будто он появился как правая часть директивы ‘#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"заставляет препроцессор выдать диагностическое предупреждение с текстом ‘message’. Сообщение, содержащееся в директиве, должно быть единственной строковой литералью. Аналогично,#pragma GCC error "message"выводит сообщение об ошибке. В отличие от директив ‘#warning’ и ‘#error’, эти директивы можно встроить в препроцессорные макросы, используя ‘_Pragma’.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.4/cpp/Pragmas.html