Spec-Zone.ru › GCC 15

6.5.13 Диагностические прагмы

GCC позволяет пользователю выборочно включать и отключать определённые типы диагностических сообщений, а также изменять их тип. Например, правила проекта могут требовать, чтобы все исходные файлы компилировались с -Werror, но для некоторых файлов могут быть предусмотрены исключения, разрешающие определённые типы предупреждений. Или проект может выборочно включать диагностические сообщения и считать их ошибками в зависимости от того, какие макросы препроцессора определены.

#pragma GCC diagnostic kind option

Изменяет тип диагностического сообщения. Обратите внимание, что не все диагностические сообщения можно изменить; в настоящее время можно управлять только предупреждениями (обычно задаваемыми параметрами ‘-W…’), и то не всеми. Используйте -fdiagnostics-show-option, чтобы определить, какими диагностическими сообщениями можно управлять и какой параметр ими управляет.

kind принимает значение ‘error’, чтобы считать это диагностическое сообщение ошибкой, ‘warning’, чтобы считать его предупреждением (даже если действует -Werror), или ‘ignored’, чтобы игнорировать диагностическое сообщение. option — это строка в двойных кавычках, соответствующая параметру командной строки.

#pragma GCC diagnostic warning "-Wformat"
#pragma GCC diagnostic error "-Wformat"
#pragma GCC diagnostic ignored "-Wformat"

Обратите внимание, что эти прагмы имеют приоритет над любыми параметрами командной строки. GCC отслеживает расположение каждой прагмы и выдаёт диагностические сообщения в соответствии с состоянием на момент её появления в исходном файле. Поэтому прагмы, расположенные после строки, не влияют на диагностические сообщения, вызванные этой строкой.

#pragma GCC diagnostic push
#pragma GCC diagnostic pop

Заставляет GCC сохранять состояние диагностических сообщений на момент каждого push и восстанавливать его до этого состояния при каждом pop. Если для pop нет соответствующего push, восстанавливаются параметры командной строки.

#pragma GCC diagnostic error "-Wuninitialized"
  foo(a);                       /* error is given for this one */
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wuninitialized"
  foo(b);                       /* no diagnostic for this one */
#pragma GCC diagnostic pop
  foo(c);                       /* error is given for this one */
#pragma GCC diagnostic pop
  foo(d);                       /* depends on command-line options */
#pragma GCC diagnostic ignored_attributes

Подобно -Wno-attributes=, эта прагма позволяет пользователям подавлять предупреждения о неизвестных атрибутах с областью видимости (в C++11 и C23). Например, #pragma GCC diagnostic ignored_attributes "vendor::attr" отключает предупреждение для следующего объявления:

[[vendor::attr]] void f();

тогда как #pragma GCC diagnostic ignored_attributes "vendor::" предотвращает предупреждения для обоих этих объявлений:

[[vendor::safe]] void f();
[[vendor::unsafe]] void f2();

GCC также предоставляет простой механизм вывода сообщений во время компиляции.

#pragma message string

Выводит string как сообщение компилятора во время компиляции. Это сообщение носит только информационный характер и не является ни предупреждением компилятора, ни ошибкой. Переводы строк можно включать в строку с помощью escape-последовательности ‘\n’.

#pragma message "Compiling " __FILE__ "..."

string можно заключить в круглые скобки; в этом случае сообщение выводится с указанием расположения. Например,

#define DO_PRAGMA(x) _Pragma (#x)
#define TODO(x) DO_PRAGMA(message ("TODO - " #x))

TODO(Remember to fix this)

выводит ‘/tmp/file.c:4: note: #pragma message: TODO - Remember to fix this’.

#pragma GCC error message

Выдаёт сообщение об ошибке. Эта прагма считается указанием на ошибку при компиляции и обрабатывается соответственно.

Переводы строк можно включать в строку с помощью escape-последовательности ‘\n’. Они будут отображаться как переводы строк, даже если значение параметра -fmessage-length равно нулю.

Ошибка возникает только в том случае, если прагма присутствует в коде после завершения предварительной обработки. При этом не имеет значения, является ли код с прагмой недостижимым:

#if 0
#pragma GCC error "this error is not seen"
#endif
void foo (void)
{
  return;
#pragma GCC error "this error is seen"
}
#pragma GCC warning message

Работает так же, как ‘pragma GCC error’, за исключением того, что вместо сообщения об ошибке выдаётся предупреждение. Однако если действует -Werror, эта прагма также приводит к ошибке.

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

Spec-Zone.ru

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