6.62.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 и C2X). Например,
#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-13.3.0/gcc/Diagnostic-Pragmas.html