# Preprocessor

From cppreference.com
< cpp

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.

### Directives

The preprocessing directives control the behavior of the preprocessor. Each directive occupies one line and has the following format:

- `#` character
- preprocessing instruction (one of `define`, `undef`, `include`, `if`, `ifdef`, `ifndef`, `else`, `elif`, `endif`, `line`, `error`, `pragma`) [1]
- arguments (depends on the instruction)
- line break

The null directive (`#` followed by a line break) is allowed and has no effect.

### Capabilities

The preprocessor has the source file translation capabilities:

- conditionally compile of parts of source file (controlled by directive `#if`, `#ifdef`, `#ifndef`, `#else`, `#elif` and `#endif`).
- replace text macros while possibly concatenating or quoting identifiers (controlled by directives `#define` and `#undef`, and operators `#` and `##`)
- include other files (controlled by directive `#include` and checked with `__has_include` (since C++17))
- cause an error (controlled by directive `#error`)

The following aspects of the preprocessor can be controlled:

- implementation defined behavior (controlled by directive `#pragma` and operator `_Pragma` (since C++11))
- file name and line information available to the preprocessor (controlled by directive `#line`)

### Footnotes

1. ↑ 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 `#warning` which emits a user-defined message during compilation.

### See also

Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/preprocessor&oldid=110640"