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 poppush, 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