Spec-Zone.ru › GCC 8 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’.

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

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

Spec-Zone.ru

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