6.62.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 */
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: примечание: #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-11.4.0/gcc/Diagnostic-Pragmas.html