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