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 redefinitions int 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]
Macro name | Value | |
__cpp_aggregate_bases | 201603L | |
__cpp_aggregate_nsdmi | 201304L | |
__cpp_aggregate_paren_init | 201902L | |
__cpp_alias_templates | 200704L | |
__cpp_aligned_new | 201606L | |
__cpp_attributes | 200809L | |
__cpp_auto_cast | 202110L | |
__cpp_binary_literals | 201304L | |
__cpp_capture_star_this | 201603L | |
__cpp_char8_t | 202207L | |
__cpp_concepts | 202002L | |
__cpp_conditional_explicit | 201806L | |
__cpp_constexpr | 202211L | |
__cpp_constexpr_dynamic_alloc | 201907L | |
__cpp_constexpr_in_decltype | 201711L | |
__cpp_consteval | 202211L | |
__cpp_constinit | 201907L | |
__cpp_decltype | 200707L | |
__cpp_decltype_auto | 201304L | |
__cpp_deduction_guides | 201907L | |
__cpp_delegating_constructors | 200604L | |
__cpp_designated_initializers | 201707L | |
__cpp_enumerator_attributes | 201411L | |
__cpp_explicit_this_parameter | 202110L | |
__cpp_fold_expressions | 201603L | |
__cpp_generic_lambdas | 201707L | |
__cpp_guaranteed_copy_elision | 201606L | |
__cpp_hex_float | 201603L | |
__cpp_if_consteval | 202106L | |
__cpp_if_constexpr | 201606L | |
__cpp_impl_coroutine | 201902L | |
__cpp_impl_destroying_delete | 201806L | |
__cpp_impl_three_way_comparison | 201907L | |
__cpp_implicit_move | 202207L | |
__cpp_inheriting_constructors | 201511L | |
__cpp_init_captures | 201803L | |
__cpp_initializer_lists | 200806L | |
__cpp_inline_variables | 201606L | |
__cpp_lambdas | 200907L | |
__cpp_modules | 201907L | |
__cpp_multidimensional_subscript | 202211L | |
__cpp_named_character_escapes | 202207L | |
__cpp_namespace_attributes | 201411L | |
__cpp_noexcept_function_type | 201510L | |
__cpp_nontype_template_args | 201911L | |
__cpp_nontype_template_parameter_auto | 201606L | |
__cpp_nsdmi | 200809L | |
__cpp_range_based_for | 202211L | |
__cpp_raw_strings | 200710L | |
__cpp_ref_qualifiers | 200710L | |
__cpp_return_type_deduction | 201304L | |
__cpp_rvalue_references | 200610L | |
__cpp_size_t_suffix | 202011L | |
__cpp_sized_deallocation | 201309L | |
__cpp_static_assert | 201411L | |
__cpp_static_call_operator | 202207L | |
__cpp_structured_bindings | 201606L | |
__cpp_template_template_args | 201611L | |
__cpp_threadsafe_static_init | 200806L | |
__cpp_unicode_characters | 200704L | |
__cpp_unicode_literals | 200710L | |
__cpp_user_defined_literals | 200809L | |
__cpp_using_enum | 201907L | |
__cpp_variable_templates | 201304L | |
__cpp_variadic_templates | 200704L | |
__cpp_variadic_using | 201611L |