15 Preprocessing directives [cpp]
pp-global-module-fragment pp-module group pp-private-module-fragment
module ; new-line group
module : private ; new-line group
# include pp-tokens new-line
# define identifier replacement-list new-line
# define identifier lparen identifier-list ) replacement-list new-line
# define identifier lparen ... ) replacement-list new-line
# define identifier lparen identifier-list , ... ) replacement-list new-line
# undef identifier new-line
# line pp-tokens new-line
# error pp-tokens new-line
# pragma pp-tokens new-line
if-group elif-groups else-group endif-line
# if constant-expression new-line group
# ifdef identifier new-line group
# ifndef identifier new-line group
# elif constant-expression new-line group
# else new-line group
# endif new-line
a ( character not immediately preceded by white-space
identifier-list , identifier
the new-line character
A preprocessing directive
consists of a sequence of preprocessing tokens
that satisfies the following constraints:
At the start of translation phase 4,
the first token in the sequence,
referred to as a directive-introducing token
begins with the first character in the source file
(optionally after white space containing no new-line characters) or
follows white space containing at least one new-line character,
The last token in the sequence is the first token within the sequence that
is immediately followed by whitespace containing a new-line character.
A new-line character ends the preprocessing directive even if it occurs
within what would otherwise be an invocation of a function-like macro.
— end note
export module leftpad;
export import "squee";
— end example
A sequence of preprocessing tokens is only a text-line
if it does not begin with a directive-introducing token.
When in a group that is skipped ([cpp.cond]
), the directive
syntax is relaxed to allow any sequence of preprocessing tokens to occur between
the directive name and the following new-line character.
The only white-space characters that shall appear
between preprocessing tokens
within a preprocessing directive
(from just after the directive-introducing token
through just before the terminating new-line character)
are space and horizontal-tab
(including spaces that have replaced comments
or possibly other white-space characters
in translation phase 3).
The implementation can
process and skip sections of source files conditionally,
include other source files,
import macros from header units,
and replace macros.
These capabilities are called
because conceptually they occur
before translation of the resulting translation unit.
The preprocessing tokens within a preprocessing directive
are not subject to macro expansion unless otherwise stated.
EMPTY # include <file.h>
the sequence of preprocessing tokens on the second line is not
a preprocessing directive, because it does not begin with a #
at the start of
translation phase 4, even though it will do so after the macro EMPTY
has been replaced.
— end example