Next: Visibility Pragmas, Previous: Weak Pragmas, Up: Pragmas

#### 6.54.10 Diagnostic 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 option
  Modifies the disposition of a diagnostic. Note that not all diagnostics are modifiable; at the moment only warnings (normally controlled by ‘`-W...`’) can be controlled, and not all of them. Use `-fdiagnostics-show-option` to determine which diagnostics are controllable and which option controls them.

  kind 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 which 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. Also, while it is syntactically valid to put these pragmas anywhere in your sources, the only supported location for them is before any data or functions are defined. Doing otherwise may result in unpredictable results depending on how the optimizer manages your sources. If the same option is listed multiple times, the last one specified is the one that is in effect. This pragma is not intended to be a general purpose replacement for command line options, but for implementing strict control over project policies.

GCC also offers a simple mechanism for printing messages during compilation.

`#pragma message` string
  Prints string as a compiler message on compilation. The message is informational only, and is neither a compilation warning nor an error.

                #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`’.