[cpp.import] # 15 Preprocessing directives [[cpp]](./#cpp) ## 15.6 Header unit importation [cpp.import] [pp-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]") [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/preprocessor.tex#L1278) A [*pp-import*](#nt:pp-import "15.6 Header unit importation [cpp.import]") shall not appear in a context where import or (if it is the first preprocessing token of the [*pp-import*](#nt:pp-import "15.6 Header unit importation [cpp.import]")) export is an identifier defined as an object-like macro[.](#1.sentence-1) [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/preprocessor.tex#L1284) The preprocessing tokens after the import preprocessing token in the import [*control-line*](cpp.pre#nt:control-line "15.1 Preamble [cpp.pre]") are processed just as in normal text (i.e., each identifier currently defined as a macro name is replaced by its replacement list of preprocessing tokens)[.](#2.sentence-1) [*Note [1](#note-1)*: An import directive matching the first two forms of a [*pp-import*](#nt:pp-import "15.6 Header unit importation [cpp.import]") instructs the preprocessor to import macros from the header unit ([[module.import]](module.import "10.3 Import declaration")) denoted by the [*header-name*](lex.header#nt:header-name "5.6 Header names [lex.header]"), as described below[.](#2.sentence-2) — *end note*] The [*point of macro import*](#def:macro,point_of_import "15.6 Header unit importation [cpp.import]") for the first two forms of [*pp-import*](#nt:pp-import "15.6 Header unit importation [cpp.import]") is immediately after the [*new-line*](cpp.pre#nt:new-line "15.1 Preamble [cpp.pre]") terminating the [*pp-import*](#nt:pp-import "15.6 Header unit importation [cpp.import]")[.](#2.sentence-3) The last form of [*pp-import*](#nt:pp-import "15.6 Header unit importation [cpp.import]") is only considered if the first two forms did not match, and does not have a point of macro import[.](#2.sentence-4) [3](#3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/preprocessor.tex#L1307) If a [*pp-import*](#nt:pp-import "15.6 Header unit importation [cpp.import]") is produced by source file inclusion (including by the rewrite produced when a #include directive names an importable header) while processing the [*group*](cpp.pre#nt:group "15.1 Preamble [cpp.pre]") of a [*module-file*](cpp.pre#nt:module-file "15.1 Preamble [cpp.pre]"), the program is ill-formed[.](#3.sentence-1) [4](#4) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/preprocessor.tex#L1314) In all three forms of [*pp-import*](#nt:pp-import "15.6 Header unit importation [cpp.import]"), the import and export (if it exists) preprocessing tokens are replaced by the *import-keyword* and*export-keyword* preprocessing tokens respectively[.](#4.sentence-1) [*Note [2](#note-2)*: This makes the line no longer a directive so it is not removed at the end of phase 4[.](#4.sentence-2) — *end note*] Additionally, in the second form of [*pp-import*](#nt:pp-import "15.6 Header unit importation [cpp.import]"), a [*header-name*](lex.header#nt:header-name "5.6 Header names [lex.header]") token is formed as if the [*header-name-tokens*](cpp.cond#nt:header-name-tokens "15.2 Conditional inclusion [cpp.cond]") were the [*pp-tokens*](cpp.pre#nt:pp-tokens "15.1 Preamble [cpp.pre]") of a #include directive[.](#4.sentence-3) The [*header-name-tokens*](cpp.cond#nt:header-name-tokens "15.2 Conditional inclusion [cpp.cond]") are replaced by the [*header-name*](lex.header#nt:header-name "5.6 Header names [lex.header]") token[.](#4.sentence-4) [*Note [3](#note-3)*: This ensures that imports are treated consistently by the preprocessor and later phases of translation[.](#4.sentence-5) — *end note*] [5](#5) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/preprocessor.tex#L1334) Each #define directive encountered when preprocessing each translation unit in a program results in a distinct[*macro definition*](#def:macro,definition "15.6 Header unit importation [cpp.import]")[.](#5.sentence-1) [*Note [4](#note-4)*: A predefined macro name ([[cpp.predefined]](cpp.predefined "15.12 Predefined macro names")) is not introduced by a #define directive[.](#5.sentence-2) Implementations providing mechanisms to predefine additional macros are encouraged to not treat them as being introduced by a #define directive[.](#5.sentence-3) — *end note*] Each macro definition has at most one point of definition in each translation unit and at most one point of undefinition, as follows: - [(5.1)](#5.1) The [*point of definition*](#def:macro,point_of_definition "15.6 Header unit importation [cpp.import]") of a macro definition within a translation unit T is * [(5.1.1)](#5.1.1) if the #define directive of the macro definition occurs within T, the point at which that directive occurs, or otherwise, * [(5.1.2)](#5.1.2) if the macro name is not lexically identical to a keyword ([[lex.key]](lex.key "5.12 Keywords")) or to the [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]")*s* module or import, the first point of macro import in T of a header unit containing a point of definition for the macro definition, if any[.](#5.1.sentence-1) In the latter case, the macro is said to be [*imported*](#def:macro,import "15.6 Header unit importation [cpp.import]") from the header unit[.](#5.1.sentence-2) - [(5.2)](#5.2) The [*point of undefinition*](#def:macro,point_of_undefinition "15.6 Header unit importation [cpp.import]") of a macro definition within a translation unit is the first point at which a #undef directive naming the macro occurs after its point of definition, or the first point of macro import of a header unit containing a point of undefinition for the macro definition, whichever (if any) occurs first[.](#5.2.sentence-1) [6](#6) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/preprocessor.tex#L1375) A macro definition is [*active*](#def:macro,active "15.6 Header unit importation [cpp.import]") at a source location if it has a point of definition in that translation unit preceding the location, and does not have a point of undefinition in that translation unit preceding the location[.](#6.sentence-1) [7](#7) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/preprocessor.tex#L1382) If a macro would be replaced or redefined, and multiple macro definitions are active for that macro name, the active macro definitions shall all be valid redefinitions of the same macro ([[cpp.replace]](cpp.replace "15.7 Macro replacement"))[.](#7.sentence-1) [*Note [5](#note-5)*: The relative order of [*pp-import*](#nt:pp-import "15.6 Header unit importation [cpp.import]")*s* has no bearing on whether a particular macro definition is active[.](#7.sentence-2) — *end note*] [8](#8) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/preprocessor.tex#L1391) [*Example [1](#example-1)*: Importable header "a.h":#define X 123 // #1#define Y 45 // #2#define Z a // #3#undef X // point of undefinition of #1 in "a.h" Importable header "b.h":import "a.h"; // point of definition of #1, #2, and #3, point of undefinition of #1 in "b.h"#define X 456 // OK, #1 is not active#define Y 6 // error: #2 is active Importable header "c.h":#define Y 45 // #4#define Z c // #5 Importable header "d.h":import "c.h"; // point of definition of #4 and #5 in "d.h" Importable header "e.h":import "a.h"; // point of definition of #1, #2, and #3, point of undefinition of #1 in "e.h"import "d.h"; // point of definition of #4 and #5 in "e.h"int a = Y; // OK, active macro definitions #2 and #4 are valid redefinitionsint c = Z; // error: active macro definitions #3 and #5 are not valid redefinitions of Z Module unit f:export module f;export import "a.h"; int a = Y; // OK Translation unit #1:import f;int x = Y; // error: Y is neither a defined macro nor a declared name — *end example*]