[gram.cpp]

# Annex A (informative) Grammar summary [[gram]](./#gram)

## A.13 Preprocessing directives [gram.cpp]

[preprocessing-file:](cpp.pre#nt:preprocessing-file "15.1 Preamble [cpp.pre]")  
[*group*](cpp.pre#nt:group "15.1 Preamble [cpp.pre]")opt  
[*module-file*](cpp.pre#nt:module-file "15.1 Preamble [cpp.pre]")

[module-file:](cpp.pre#nt:module-file "15.1 Preamble [cpp.pre]")  
[*pp-global-module-fragment*](cpp.pre#nt:pp-global-module-fragment "15.1 Preamble [cpp.pre]")opt [*pp-module*](cpp.module#nt:pp-module "15.5 Module directive [cpp.module]") [*group*](cpp.pre#nt:group "15.1 Preamble [cpp.pre]")opt [*pp-private-module-fragment*](cpp.pre#nt:pp-private-module-fragment "15.1 Preamble [cpp.pre]")opt

[pp-global-module-fragment:](cpp.pre#nt:pp-global-module-fragment "15.1 Preamble [cpp.pre]")  
module ; [*new-line*](cpp.pre#nt:new-line "15.1 Preamble [cpp.pre]") [*group*](cpp.pre#nt:group "15.1 Preamble [cpp.pre]")opt

[pp-private-module-fragment:](cpp.pre#nt:pp-private-module-fragment "15.1 Preamble [cpp.pre]")  
module : private ; [*new-line*](cpp.pre#nt:new-line "15.1 Preamble [cpp.pre]") [*group*](cpp.pre#nt:group "15.1 Preamble [cpp.pre]")opt

[group:](cpp.pre#nt:group "15.1 Preamble [cpp.pre]")  
[*group-part*](cpp.pre#nt:group-part "15.1 Preamble [cpp.pre]")  
[*group*](cpp.pre#nt:group "15.1 Preamble [cpp.pre]") [*group-part*](cpp.pre#nt:group-part "15.1 Preamble [cpp.pre]")

[group-part:](cpp.pre#nt:group-part "15.1 Preamble [cpp.pre]")  
[*control-line*](cpp.pre#nt:control-line "15.1 Preamble [cpp.pre]")  
[*if-section*](cpp.pre#nt:if-section "15.1 Preamble [cpp.pre]")  
[*text-line*](cpp.pre#nt:text-line "15.1 Preamble [cpp.pre]")  
# [*conditionally-supported-directive*](cpp.pre#nt:conditionally-supported-directive "15.1 Preamble [cpp.pre]")

[control-line:](cpp.pre#nt:control-line "15.1 Preamble [cpp.pre]")  
# include [*pp-tokens*](cpp.pre#nt:pp-tokens "15.1 Preamble [cpp.pre]") [*new-line*](cpp.pre#nt:new-line "15.1 Preamble [cpp.pre]")  
[*pp-import*](cpp.import#nt:pp-import "15.6 Header unit importation [cpp.import]")  
# embed  [*pp-tokens*](cpp.pre#nt:pp-tokens "15.1 Preamble [cpp.pre]") [*new-line*](cpp.pre#nt:new-line "15.1 Preamble [cpp.pre]")  
# define  [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]") [*replacement-list*](cpp.pre#nt:replacement-list "15.1 Preamble [cpp.pre]") [*new-line*](cpp.pre#nt:new-line "15.1 Preamble [cpp.pre]")  
# define  [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]") [*lparen*](cpp.pre#nt:lparen "15.1 Preamble [cpp.pre]") [*identifier-list*](cpp.pre#nt:identifier-list "15.1 Preamble [cpp.pre]")opt ) [*replacement-list*](cpp.pre#nt:replacement-list "15.1 Preamble [cpp.pre]") [*new-line*](cpp.pre#nt:new-line "15.1 Preamble [cpp.pre]")  
# define  [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]") [*lparen*](cpp.pre#nt:lparen "15.1 Preamble [cpp.pre]") ... ) [*replacement-list*](cpp.pre#nt:replacement-list "15.1 Preamble [cpp.pre]") [*new-line*](cpp.pre#nt:new-line "15.1 Preamble [cpp.pre]")  
# define  [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]") [*lparen*](cpp.pre#nt:lparen "15.1 Preamble [cpp.pre]") [*identifier-list*](cpp.pre#nt:identifier-list "15.1 Preamble [cpp.pre]") , ... ) [*replacement-list*](cpp.pre#nt:replacement-list "15.1 Preamble [cpp.pre]") [*new-line*](cpp.pre#nt:new-line "15.1 Preamble [cpp.pre]")  
# undef  [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]") [*new-line*](cpp.pre#nt:new-line "15.1 Preamble [cpp.pre]")  
# line  [*pp-tokens*](cpp.pre#nt:pp-tokens "15.1 Preamble [cpp.pre]") [*new-line*](cpp.pre#nt:new-line "15.1 Preamble [cpp.pre]")  
# error  [*pp-tokens*](cpp.pre#nt:pp-tokens "15.1 Preamble [cpp.pre]")opt [*new-line*](cpp.pre#nt:new-line "15.1 Preamble [cpp.pre]")  
# warning [*pp-tokens*](cpp.pre#nt:pp-tokens "15.1 Preamble [cpp.pre]")opt [*new-line*](cpp.pre#nt:new-line "15.1 Preamble [cpp.pre]")  
# pragma  [*pp-tokens*](cpp.pre#nt:pp-tokens "15.1 Preamble [cpp.pre]")opt [*new-line*](cpp.pre#nt:new-line "15.1 Preamble [cpp.pre]")  
# [*new-line*](cpp.pre#nt:new-line "15.1 Preamble [cpp.pre]")

[if-section:](cpp.pre#nt:if-section "15.1 Preamble [cpp.pre]")  
[*if-group*](cpp.pre#nt:if-group "15.1 Preamble [cpp.pre]") [*elif-groups*](cpp.pre#nt:elif-groups "15.1 Preamble [cpp.pre]")opt [*else-group*](cpp.pre#nt:else-group "15.1 Preamble [cpp.pre]")opt [*endif-line*](cpp.pre#nt:endif-line "15.1 Preamble [cpp.pre]")

[if-group:](cpp.pre#nt:if-group "15.1 Preamble [cpp.pre]")  
# if  [*constant-expression*](expr.const#nt:constant-expression "7.7 Constant expressions [expr.const]") [*new-line*](cpp.pre#nt:new-line "15.1 Preamble [cpp.pre]") [*group*](cpp.pre#nt:group "15.1 Preamble [cpp.pre]")opt  
# ifdef  [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]") [*new-line*](cpp.pre#nt:new-line "15.1 Preamble [cpp.pre]") [*group*](cpp.pre#nt:group "15.1 Preamble [cpp.pre]")opt  
# ifndef  [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]") [*new-line*](cpp.pre#nt:new-line "15.1 Preamble [cpp.pre]") [*group*](cpp.pre#nt:group "15.1 Preamble [cpp.pre]")opt

[elif-groups:](cpp.pre#nt:elif-groups "15.1 Preamble [cpp.pre]")  
[*elif-group*](cpp.pre#nt:elif-group "15.1 Preamble [cpp.pre]") [*elif-groups*](cpp.pre#nt:elif-groups "15.1 Preamble [cpp.pre]")opt

[elif-group:](cpp.pre#nt:elif-group "15.1 Preamble [cpp.pre]")  
# elif  [*constant-expression*](expr.const#nt:constant-expression "7.7 Constant expressions [expr.const]") [*new-line*](cpp.pre#nt:new-line "15.1 Preamble [cpp.pre]") [*group*](cpp.pre#nt:group "15.1 Preamble [cpp.pre]")opt  
# elifdef  [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]") [*new-line*](cpp.pre#nt:new-line "15.1 Preamble [cpp.pre]") [*group*](cpp.pre#nt:group "15.1 Preamble [cpp.pre]")opt  
# elifndef [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]") [*new-line*](cpp.pre#nt:new-line "15.1 Preamble [cpp.pre]") [*group*](cpp.pre#nt:group "15.1 Preamble [cpp.pre]")opt

[else-group:](cpp.pre#nt:else-group "15.1 Preamble [cpp.pre]")  
# else  [*new-line*](cpp.pre#nt:new-line "15.1 Preamble [cpp.pre]") [*group*](cpp.pre#nt:group "15.1 Preamble [cpp.pre]")opt

[endif-line:](cpp.pre#nt:endif-line "15.1 Preamble [cpp.pre]")  
# endif  [*new-line*](cpp.pre#nt:new-line "15.1 Preamble [cpp.pre]")

[text-line:](cpp.pre#nt:text-line "15.1 Preamble [cpp.pre]")  
[*pp-tokens*](cpp.pre#nt:pp-tokens "15.1 Preamble [cpp.pre]")opt [*new-line*](cpp.pre#nt:new-line "15.1 Preamble [cpp.pre]")

[conditionally-supported-directive:](cpp.pre#nt:conditionally-supported-directive "15.1 Preamble [cpp.pre]")  
[*pp-tokens*](cpp.pre#nt:pp-tokens "15.1 Preamble [cpp.pre]") [*new-line*](cpp.pre#nt:new-line "15.1 Preamble [cpp.pre]")

[lparen:](cpp.pre#nt:lparen "15.1 Preamble [cpp.pre]")  
a ( character not immediately preceded by whitespace

[identifier-list:](cpp.pre#nt:identifier-list "15.1 Preamble [cpp.pre]")  
[*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]")  
[*identifier-list*](cpp.pre#nt:identifier-list "15.1 Preamble [cpp.pre]") , [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]")

[replacement-list:](cpp.pre#nt:replacement-list "15.1 Preamble [cpp.pre]")  
[*pp-tokens*](cpp.pre#nt:pp-tokens "15.1 Preamble [cpp.pre]")opt

[pp-tokens:](cpp.pre#nt:pp-tokens "15.1 Preamble [cpp.pre]")  
[*preprocessing-token*](lex.pptoken#nt:preprocessing-token "5.5 Preprocessing tokens [lex.pptoken]") [*pp-tokens*](cpp.pre#nt:pp-tokens "15.1 Preamble [cpp.pre]")opt

[embed-parameter-seq:](cpp.pre#nt:embed-parameter-seq "15.1 Preamble [cpp.pre]")  
[*embed-parameter*](cpp.pre#nt:embed-parameter "15.1 Preamble [cpp.pre]") [*embed-parameter-seq*](cpp.pre#nt:embed-parameter-seq "15.1 Preamble [cpp.pre]")opt

[embed-parameter:](cpp.pre#nt:embed-parameter "15.1 Preamble [cpp.pre]")  
[*embed-standard-parameter*](cpp.pre#nt:embed-standard-parameter "15.1 Preamble [cpp.pre]")  
[*embed-prefixed-parameter*](cpp.pre#nt:embed-prefixed-parameter "15.1 Preamble [cpp.pre]")

[embed-standard-parameter:](cpp.pre#nt:embed-standard-parameter "15.1 Preamble [cpp.pre]")  
limit ( [*pp-balanced-token-seq*](cpp.pre#nt:pp-balanced-token-seq "15.1 Preamble [cpp.pre]") )  
prefix ( [*pp-balanced-token-seq*](cpp.pre#nt:pp-balanced-token-seq "15.1 Preamble [cpp.pre]")opt )  
suffix ( [*pp-balanced-token-seq*](cpp.pre#nt:pp-balanced-token-seq "15.1 Preamble [cpp.pre]")opt )  
if_empty ( [*pp-balanced-token-seq*](cpp.pre#nt:pp-balanced-token-seq "15.1 Preamble [cpp.pre]")opt )

[embed-prefixed-parameter:](cpp.pre#nt:embed-prefixed-parameter "15.1 Preamble [cpp.pre]")  
[*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]") :: [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]")  
[*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]") :: [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]") ( [*pp-balanced-token-seq*](cpp.pre#nt:pp-balanced-token-seq "15.1 Preamble [cpp.pre]")opt )

[pp-balanced-token-seq:](cpp.pre#nt:pp-balanced-token-seq "15.1 Preamble [cpp.pre]")  
[*pp-balanced-token*](cpp.pre#nt:pp-balanced-token "15.1 Preamble [cpp.pre]") [*pp-balanced-token-seq*](cpp.pre#nt:pp-balanced-token-seq "15.1 Preamble [cpp.pre]")opt

[pp-balanced-token:](cpp.pre#nt:pp-balanced-token "15.1 Preamble [cpp.pre]")  
( [*pp-balanced-token-seq*](cpp.pre#nt:pp-balanced-token-seq "15.1 Preamble [cpp.pre]")opt )  
[ [*pp-balanced-token-seq*](cpp.pre#nt:pp-balanced-token-seq "15.1 Preamble [cpp.pre]")opt ]  
{ [*pp-balanced-token-seq*](cpp.pre#nt:pp-balanced-token-seq "15.1 Preamble [cpp.pre]")opt }  
any pp-token except:  
 parenthesis (U+0028 left parenthesis and U+0029 right parenthesis),  
 bracket (U+005b left square bracket and U+005d right square bracket), or  
 brace (U+007b left curly bracket and U+007d right curly bracket).

[new-line:](cpp.pre#nt:new-line "15.1 Preamble [cpp.pre]")  
the new-line character

[defined-macro-expression:](cpp.cond#nt:defined-macro-expression "15.2 Conditional inclusion [cpp.cond]")  
defined [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]")  
defined ( [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]") )

[h-preprocessing-token:](cpp.cond#nt:h-preprocessing-token "15.2 Conditional inclusion [cpp.cond]")  
any [*preprocessing-token*](lex.pptoken#nt:preprocessing-token "5.5 Preprocessing tokens [lex.pptoken]") other than >

[h-pp-tokens:](cpp.cond#nt:h-pp-tokens "15.2 Conditional inclusion [cpp.cond]")  
[*h-preprocessing-token*](cpp.cond#nt:h-preprocessing-token "15.2 Conditional inclusion [cpp.cond]") [*h-pp-tokens*](cpp.cond#nt:h-pp-tokens "15.2 Conditional inclusion [cpp.cond]")opt

[header-name-tokens:](cpp.cond#nt:header-name-tokens "15.2 Conditional inclusion [cpp.cond]")  
[*string-literal*](lex.string#nt:string-literal "5.13.5 String literals [lex.string]")  
< [*h-pp-tokens*](cpp.cond#nt:h-pp-tokens "15.2 Conditional inclusion [cpp.cond]") >

[has-include-expression:](cpp.cond#nt:has-include-expression "15.2 Conditional inclusion [cpp.cond]")  
__has_include ( [*header-name*](lex.header#nt:header-name "5.6 Header names [lex.header]") )  
__has_include ( [*header-name-tokens*](cpp.cond#nt:header-name-tokens "15.2 Conditional inclusion [cpp.cond]") )

[has-embed-expression:](cpp.cond#nt:has-embed-expression "15.2 Conditional inclusion [cpp.cond]")  
__has_embed ( [*header-name*](lex.header#nt:header-name "5.6 Header names [lex.header]") [*pp-balanced-token-seq*](cpp.pre#nt:pp-balanced-token-seq "15.1 Preamble [cpp.pre]")opt )  
__has_embed ( [*header-name-tokens*](cpp.cond#nt:header-name-tokens "15.2 Conditional inclusion [cpp.cond]") [*pp-balanced-token-seq*](cpp.pre#nt:pp-balanced-token-seq "15.1 Preamble [cpp.pre]")opt )

[has-attribute-expression:](cpp.cond#nt:has-attribute-expression "15.2 Conditional inclusion [cpp.cond]")  
__has_cpp_attribute ( [*pp-tokens*](cpp.pre#nt:pp-tokens "15.1 Preamble [cpp.pre]") )

[pp-module:](cpp.module#nt:pp-module "15.5 Module directive [cpp.module]")  
exportopt module [*pp-tokens*](cpp.pre#nt:pp-tokens "15.1 Preamble [cpp.pre]")opt ; [*new-line*](cpp.pre#nt:new-line "15.1 Preamble [cpp.pre]")

[pp-import:](cpp.import#nt:pp-import "15.6 Header unit importation [cpp.import]")  
exportopt import [*header-name*](lex.header#nt:header-name "5.6 Header names [lex.header]") [*pp-tokens*](cpp.pre#nt:pp-tokens "15.1 Preamble [cpp.pre]")opt ; [*new-line*](cpp.pre#nt:new-line "15.1 Preamble [cpp.pre]")  
exportopt import [*header-name-tokens*](cpp.cond#nt:header-name-tokens "15.2 Conditional inclusion [cpp.cond]") [*pp-tokens*](cpp.pre#nt:pp-tokens "15.1 Preamble [cpp.pre]")opt ; [*new-line*](cpp.pre#nt:new-line "15.1 Preamble [cpp.pre]")  
exportopt import [*pp-tokens*](cpp.pre#nt:pp-tokens "15.1 Preamble [cpp.pre]") ; [*new-line*](cpp.pre#nt:new-line "15.1 Preamble [cpp.pre]")

[va-opt-replacement:](cpp.subst#nt:va-opt-replacement "15.7.2 Argument substitution [cpp.subst]")  
__VA_OPT__ ( [*pp-tokens*](cpp.pre#nt:pp-tokens "15.1 Preamble [cpp.pre]")opt )
