The preprocessor is executed at translation phase 4, before the compilation. The result of preprocessing is a single file which is then passed to the actual compiler.
The preprocessing directives control the behavior of the preprocessor. Each directive occupies one line and has the following format:
- preprocessing instruction (one of
- arguments (depends on the instruction)
- line break
The null directive (
# followed by a line break) is allowed and has no effect.
The module and import directives are also preprocessing directives.
Preprocessing directives must not come from macro expansion.
#define EMPTY EMPTY # include <file.h> // not a preprocessing directive
The preprocessor has the source file translation capabilities:
- conditionally compile of parts of source file (controlled by directive
- replace text macros while possibly concatenating or quoting identifiers (controlled by directives
#undef, and operators
- include other files (controlled by directive
#includeand checked with
- cause an error (controlled by directive
The following aspects of the preprocessor can be controlled:
- implementation defined behavior (controlled by directive
_Pragma(since C++11)). In addition, some compilers support (to varying degrees) the operator
__pragmaas a non-standard extension.
- file name and line information available to the preprocessor (controlled by directive
- These are the directives defined by the standard. The standard does not define behavior for other directives: they might be ignored, have some useful meaning, or cause a compile-time error. Even if otherwise ignored, they are removed from the source code when the preprocessor is done. A common non-standard extension is the directive
#warningwhich emits a user-defined message during compilation.
 See also
C documentation for preprocessor