Next: Visibility Pragmas, Previous: Weak Pragmas, Up: Pragmas
GCC allows the user to selectively enable or disable certain types of diagnostics, and change the kind of the diagnostic. For example, a project's policy might require that all sources compile with -Werror but certain files might have exceptions allowing specific types of warnings. Or, a project might selectively enable diagnostics and treat them as errors depending on which preprocessor macros are defined.
#pragma GCC diagnostic
kind optionkind is `error' to treat this diagnostic as an error, `warning' to treat it like a warning (even if -Werror is in effect), or `ignored' if the diagnostic is to be ignored. option is a double quoted string that matches the command-line option.
#pragma GCC diagnostic warning "-Wformat" #pragma GCC diagnostic error "-Wformat" #pragma GCC diagnostic ignored "-Wformat"
Note that these pragmas override any command-line options. GCC keeps
track of the location of each pragma, and issues diagnostics according
to the state as of that point in the source file. Thus, pragmas occurring
after a line do not affect diagnostics caused by that line.
#pragma GCC diagnostic push
#pragma GCC diagnostic pop
push
, and restore to that point at each pop
. If a
pop
has no matching push
, the command-line options are
restored.
#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
#pragma GCC diagnostic ignored_attributes "vendor::attr"
disables
warning about the following declaration:
[[vendor::attr]] void f();
whereas #pragma GCC diagnostic ignored_attributes "vendor::"
prevents
warning about both of these declarations:
[[vendor::safe]] void f(); [[vendor::unsafe]] void f2();
GCC also offers a simple mechanism for printing messages during compilation.
#pragma message
string#pragma message "Compiling " __FILE__ "..."
string may be parenthesized, and is printed with location information. For example,
#define DO_PRAGMA(x) _Pragma (#x) #define TODO(x) DO_PRAGMA(message ("TODO - " #x)) TODO(Remember to fix this)
prints `/tmp/file.c:4: note: #pragma message:
TODO - Remember to fix this'.
#pragma GCC error
messageNewlines can be included in the string by using the `\n' escape sequence. They will be displayed as newlines even if the -fmessage-length option is set to zero.
The error is only generated if the pragma is present in the code after pre-processing has been completed. It does not matter however if the code containing the pragma is unreachable:
#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