Spec-Zone.ru › GCC 14

6.64.12 Диагностические директивы

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

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

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

строка может быть помещена в скобки и выводится с информацией о местоположении. Например,

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

TODO(Remember to fix this)

выводит ‘/tmp/file.c:4: примечание: #pragma message: TODO - Не забудьте исправить это’.

#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-14.2.0/gcc/Diagnostic-Pragmas.html

Spec-Zone.ru

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