Spec-Zone.ru › GCC 5 CPP

7 Директивы

Директива ‘#pragma’ — это метод, указанный в стандарте C для предоставления дополнительной информации компилятору, помимо той, что передаётся непосредственно языком. Стандарт C 1999 года определяет три формы этой директивы (обычно называемые директивами). Компилятор C свободен придавать любые значения другим директивам.

GCC исторически предпочитал использовать расширения синтаксиса языка, такие как __attribute__, для этой цели. Однако GCC определяет несколько собственных директив. Они в основном влияют на весь трансляционный блок или исходный файл.

В версии GCC 3 все определённые и поддерживаемые GNU директивы получили префикс GCC. Это соответствует префиксу STDC для всех директив, определённых в C99. Для обеспечения обратной совместимости директивы, которые распознавались предыдущими версиями, по-прежнему распознаются без префикса GCC, но такое использование устарело. Некоторые более старые директивы полностью устарели. Они не распознаются с префиксом 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-5.5.0/cpp/Pragmas.html

Spec-Zone.ru

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