Files
cppdraft_translate/cppdraft/cpp/predefined.md
2025-10-25 03:02:53 +03:00

273 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[cpp.predefined]
# 15 Preprocessing directives [[cpp]](./#cpp)
## 15.12 Predefined macro names [cpp.predefined]
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/preprocessor.tex#L2173)
The following macro names shall be defined by the implementation:
- [(1.1)](#1.1)
__cplusplus
The integer literal 202302L[.](#1.1.sentence-2)
[*Note [1](#note-1)*:
Future revisions of this document will
replace the value of this macro with a greater value[.](#1.1.sentence-3)
— *end note*]
- [(1.2)](#1.2)
The names listed in Table [22](#tab:cpp.predefined.ft "Table 22: Feature-test macros")[.](#1.2.sentence-1)
The macros defined in Table [22](#tab:cpp.predefined.ft "Table 22: Feature-test macros") shall be defined to
the corresponding integer literal[.](#1.2.sentence-2)
[*Note [2](#note-2)*:
Future revisions of this document might replace
the values of these macros with greater values[.](#1.2.sentence-3)
— *end note*]
- [(1.3)](#1.3)
__DATE__
The date of translation of the source file:
a character string literal of the form"Mmm dd yyyy",
where the names of the months are the same as those generated
by theasctime function,
and the first character ofdd is a space character if the value is less than 10[.](#1.3.sentence-2)
If the date of translation is not available,
an implementation-defined valid date
shall be supplied[.](#1.3.sentence-3)
- [(1.4)](#1.4)
__FILE__
The presumed name of the current source file (a character string
literal)[.](#1.4.sentence-2)[129](#footnote-129 "The presumed source file name can be changed by the #line directive.")
- [(1.5)](#1.5)
__LINE__
The presumed line number (within the current source file) of the current source line
(an integer literal)[.](#1.5.sentence-2)[130](#footnote-130 "The presumed line number can be changed by the #line directive.")
- [(1.6)](#1.6)
__STDC_EMBED_NOT_FOUND__, __STDC_EMBED_FOUND__, and __STDC_EMBED_EMPTY__
The integer literals 0, 1, and 2, respectively[.](#1.6.sentence-2)
[*Note [3](#note-3)*:
These represent values replaced from [*has-embed-expression*](cpp.cond#nt:has-embed-expression "15.2Conditional inclusion[cpp.cond]")*s* ([[cpp.cond]](cpp.cond "15.2Conditional inclusion"))[.](#1.6.sentence-3)
— *end note*]
- [(1.7)](#1.7)
__STDC_HOSTED__
The integer literal 1 if the implementation is a hosted implementation or
the integer literal 0 if it is a freestanding implementation ([[intro.compliance]](intro.compliance "4.1Implementation compliance"))[.](#1.7.sentence-2)
- [(1.8)](#1.8)
__STDCPP_DEFAULT_NEW_ALIGNMENT__
An integer literal of type std::size_t whose value is the alignment guaranteed
by a call to operator new(std::size_t) or operator new[](std::size_t)[.](#1.8.sentence-2)
[*Note [4](#note-4)*:
Larger alignments will be passed tooperator new(std::size_t, std::align_val_t), etc[.](#1.8.sentence-3)
([[expr.new]](expr.new "7.6.2.8New"))[.](#1.8.sentence-4)
— *end note*]
- [(1.9)](#1.9)
__STDCPP_FLOAT16_T__
Defined as the integer literal 1 if and only if the implementation supports
the ISO/IEC 60559 floating-point interchange format binary16
as an extended floating-point type ([[basic.extended.fp]](basic.extended.fp "6.9.3Optional extended floating-point types"))[.](#1.9.sentence-2)
- [(1.10)](#1.10)
__STDCPP_FLOAT32_T__
Defined as the integer literal 1 if and only if the implementation supports
the ISO/IEC 60559 floating-point interchange format binary32
as an extended floating-point type[.](#1.10.sentence-2)
- [(1.11)](#1.11)
__STDCPP_FLOAT64_T__
Defined as the integer literal 1 if and only if the implementation supports
the ISO/IEC 60559 floating-point interchange format binary64
as an extended floating-point type[.](#1.11.sentence-2)
- [(1.12)](#1.12)
__STDCPP_FLOAT128_T__
Defined as the integer literal 1 if and only if the implementation supports
the ISO/IEC 60559 floating-point interchange format binary128
as an extended floating-point type[.](#1.12.sentence-2)
- [(1.13)](#1.13)
__STDCPP_BFLOAT16_T__
Defined as the integer literal 1 if and only if the implementation supports an extended floating-point type
with the properties of the [*typedef-name*](dcl.typedef#nt:typedef-name "9.2.4The typedef specifier[dcl.typedef]") std::bfloat16_t as described in [[basic.extended.fp]](basic.extended.fp "6.9.3Optional extended floating-point types")[.](#1.13.sentence-2)
- [(1.14)](#1.14)
__TIME__
The time of translation of the source file:
a character string literal of the form"hh:mm:ss" as in the time generated by theasctime function[.](#1.14.sentence-2)
If the time of translation is not available,
an implementation-defined valid time shall be supplied[.](#1.14.sentence-3)
Table [22](#tab:cpp.predefined.ft) — Feature-test macros [[tab:cpp.predefined.ft]](./tab:cpp.predefined.ft)
| [🔗](#tab:cpp.predefined.ft-row-1)<br>**Macro name** | **Value** |
| --- | --- |
| [🔗](#tab:cpp.predefined.ft-row-2)<br>__cpp_aggregate_bases | 201603L |
| [🔗](#tab:cpp.predefined.ft-row-3)<br>__cpp_aggregate_nsdmi | 201304L |
| [🔗](#tab:cpp.predefined.ft-row-4)<br>__cpp_aggregate_paren_init | 201902L |
| [🔗](#tab:cpp.predefined.ft-row-5)<br>__cpp_alias_templates | 200704L |
| [🔗](#tab:cpp.predefined.ft-row-6)<br>__cpp_aligned_new | 201606L |
| [🔗](#tab:cpp.predefined.ft-row-7)<br>__cpp_attributes | 200809L |
| [🔗](#tab:cpp.predefined.ft-row-8)<br>__cpp_auto_cast | 202110L |
| [🔗](#tab:cpp.predefined.ft-row-9)<br>__cpp_binary_literals | 201304L |
| [🔗](#tab:cpp.predefined.ft-row-10)<br>__cpp_capture_star_this | 201603L |
| [🔗](#tab:cpp.predefined.ft-row-11)<br>__cpp_char8_t | 202207L |
| [🔗](#tab:cpp.predefined.ft-row-12)<br>__cpp_concepts | 202002L |
| [🔗](#tab:cpp.predefined.ft-row-13)<br>__cpp_conditional_explicit | 201806L |
| [🔗](#tab:cpp.predefined.ft-row-14)<br>__cpp_constexpr | 202406L |
| [🔗](#tab:cpp.predefined.ft-row-15)<br>__cpp_constexpr_dynamic_alloc | 201907L |
| [🔗](#tab:cpp.predefined.ft-row-16)<br>__cpp_constexpr_exceptions | 202411L |
| [🔗](#tab:cpp.predefined.ft-row-17)<br>__cpp_constexpr_in_decltype | 201711L |
| [🔗](#tab:cpp.predefined.ft-row-18)<br>__cpp_constexpr_virtual_inheritance | 202506L |
| [🔗](#tab:cpp.predefined.ft-row-19)<br>__cpp_consteval | 202211L |
| [🔗](#tab:cpp.predefined.ft-row-20)<br>__cpp_constinit | 201907L |
| [🔗](#tab:cpp.predefined.ft-row-21)<br>__cpp_contracts | 202502L |
| [🔗](#tab:cpp.predefined.ft-row-22)<br>__cpp_decltype | 200707L |
| [🔗](#tab:cpp.predefined.ft-row-23)<br>__cpp_decltype_auto | 201304L |
| [🔗](#tab:cpp.predefined.ft-row-24)<br>__cpp_deduction_guides | 201907L |
| [🔗](#tab:cpp.predefined.ft-row-25)<br>__cpp_delegating_constructors | 200604L |
| [🔗](#tab:cpp.predefined.ft-row-26)<br>__cpp_deleted_function | 202403L |
| [🔗](#tab:cpp.predefined.ft-row-27)<br>__cpp_designated_initializers | 201707L |
| [🔗](#tab:cpp.predefined.ft-row-28)<br>__cpp_enumerator_attributes | 201411L |
| [🔗](#tab:cpp.predefined.ft-row-29)<br>__cpp_expansion_statements | 202506L |
| [🔗](#tab:cpp.predefined.ft-row-30)<br>__cpp_explicit_this_parameter | 202110L |
| [🔗](#tab:cpp.predefined.ft-row-31)<br>__cpp_fold_expressions | 201603L |
| [🔗](#tab:cpp.predefined.ft-row-32)<br>__cpp_generic_lambdas | 201707L |
| [🔗](#tab:cpp.predefined.ft-row-33)<br>__cpp_guaranteed_copy_elision | 201606L |
| [🔗](#tab:cpp.predefined.ft-row-34)<br>__cpp_hex_float | 201603L |
| [🔗](#tab:cpp.predefined.ft-row-35)<br>__cpp_if_consteval | 202106L |
| [🔗](#tab:cpp.predefined.ft-row-36)<br>__cpp_if_constexpr | 201606L |
| [🔗](#tab:cpp.predefined.ft-row-37)<br>__cpp_impl_coroutine | 201902L |
| [🔗](#tab:cpp.predefined.ft-row-38)<br>__cpp_impl_destroying_delete | 201806L |
| [🔗](#tab:cpp.predefined.ft-row-39)<br>__cpp_impl_three_way_comparison | 201907L |
| [🔗](#tab:cpp.predefined.ft-row-40)<br>__cpp_impl_reflection | 202506L |
| [🔗](#tab:cpp.predefined.ft-row-41)<br>__cpp_implicit_move | 202207L |
| [🔗](#tab:cpp.predefined.ft-row-42)<br>__cpp_inheriting_constructors | 201511L |
| [🔗](#tab:cpp.predefined.ft-row-43)<br>__cpp_init_captures | 201803L |
| [🔗](#tab:cpp.predefined.ft-row-44)<br>__cpp_initializer_lists | 200806L |
| [🔗](#tab:cpp.predefined.ft-row-45)<br>__cpp_inline_variables | 201606L |
| [🔗](#tab:cpp.predefined.ft-row-46)<br>__cpp_lambdas | 200907L |
| [🔗](#tab:cpp.predefined.ft-row-47)<br>__cpp_modules | 201907L |
| [🔗](#tab:cpp.predefined.ft-row-48)<br>__cpp_multidimensional_subscript | 202211L |
| [🔗](#tab:cpp.predefined.ft-row-49)<br>__cpp_named_character_escapes | 202207L |
| [🔗](#tab:cpp.predefined.ft-row-50)<br>__cpp_namespace_attributes | 201411L |
| [🔗](#tab:cpp.predefined.ft-row-51)<br>__cpp_noexcept_function_type | 201510L |
| [🔗](#tab:cpp.predefined.ft-row-52)<br>__cpp_nontype_template_args | 201911L |
| [🔗](#tab:cpp.predefined.ft-row-53)<br>__cpp_nontype_template_parameter_auto | 201606L |
| [🔗](#tab:cpp.predefined.ft-row-54)<br>__cpp_nsdmi | 200809L |
| [🔗](#tab:cpp.predefined.ft-row-55)<br>__cpp_pack_indexing | 202311L |
| [🔗](#tab:cpp.predefined.ft-row-56)<br>__cpp_placeholder_variables | 202306L |
| [🔗](#tab:cpp.predefined.ft-row-57)<br>__cpp_pp_embed | 202502L |
| [🔗](#tab:cpp.predefined.ft-row-58)<br>__cpp_range_based_for | 202211L |
| [🔗](#tab:cpp.predefined.ft-row-59)<br>__cpp_raw_strings | 200710L |
| [🔗](#tab:cpp.predefined.ft-row-60)<br>__cpp_ref_qualifiers | 200710L |
| [🔗](#tab:cpp.predefined.ft-row-61)<br>__cpp_return_type_deduction | 201304L |
| [🔗](#tab:cpp.predefined.ft-row-62)<br>__cpp_rvalue_references | 200610L |
| [🔗](#tab:cpp.predefined.ft-row-63)<br>__cpp_size_t_suffix | 202011L |
| [🔗](#tab:cpp.predefined.ft-row-64)<br>__cpp_sized_deallocation | 201309L |
| [🔗](#tab:cpp.predefined.ft-row-65)<br>__cpp_static_assert | 202306L |
| [🔗](#tab:cpp.predefined.ft-row-66)<br>__cpp_static_call_operator | 202207L |
| [🔗](#tab:cpp.predefined.ft-row-67)<br>__cpp_structured_bindings | 202411L |
| [🔗](#tab:cpp.predefined.ft-row-68)<br>__cpp_template_parameters | 202502L |
| [🔗](#tab:cpp.predefined.ft-row-69)<br>__cpp_template_template_args | 201611L |
| [🔗](#tab:cpp.predefined.ft-row-70)<br>__cpp_threadsafe_static_init | 200806L |
| [🔗](#tab:cpp.predefined.ft-row-71)<br>__cpp_trivial_relocatability | 202502L |
| [🔗](#tab:cpp.predefined.ft-row-72)<br>__cpp_trivial_union | 202502L |
| [🔗](#tab:cpp.predefined.ft-row-73)<br>__cpp_unicode_characters | 200704L |
| [🔗](#tab:cpp.predefined.ft-row-74)<br>__cpp_unicode_literals | 200710L |
| [🔗](#tab:cpp.predefined.ft-row-75)<br>__cpp_user_defined_literals | 200809L |
| [🔗](#tab:cpp.predefined.ft-row-76)<br>__cpp_using_enum | 201907L |
| [🔗](#tab:cpp.predefined.ft-row-77)<br>__cpp_variable_templates | 201304L |
| [🔗](#tab:cpp.predefined.ft-row-78)<br>__cpp_variadic_friend | 202403L |
| [🔗](#tab:cpp.predefined.ft-row-79)<br>__cpp_variadic_templates | 200704L |
| [🔗](#tab:cpp.predefined.ft-row-80)<br>__cpp_variadic_using | 201611L |
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/preprocessor.tex#L2405)
The following macro names are conditionally defined by the implementation:
- [(2.1)](#2.1)
__STDC__
Whether __STDC__ is predefined and if so, what its value is,
are implementation-defined[.](#2.1.sentence-2)
- [(2.2)](#2.2)
__STDC_MB_MIGHT_NEQ_WC__
The integer literal 1, intended to indicate that, in the encoding forwchar_t, a member of the basic character set need not have a code value equal to
its value when used as the lone character in an ordinary character literal[.](#2.2.sentence-2)
- [(2.3)](#2.3)
__STDC_VERSION__
Whether __STDC_VERSION__ is predefined and if so, what its value is,
are implementation-defined[.](#2.3.sentence-2)
- [(2.4)](#2.4)
__STDC_ISO_10646__
An integer literal of the form yyyymmL (for example, 199712L)[.](#2.4.sentence-2)
Whether __STDC_ISO_10646__ is predefined and
if so, what its value is,
are implementation-defined[.](#2.4.sentence-3)
- [(2.5)](#2.5)
__STDCPP_THREADS__
Defined, and has the value integer literal 1, if and only if a program
can have more than one [thread of execution](intro.multithread "6.10.2Multi-threaded executions and data races[intro.multithread]")[.](#2.5.sentence-2)
[3](#3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/preprocessor.tex#L2443)
The values of the predefined macros
(except for__FILE__ and__LINE__)
remain constant throughout the translation unit[.](#3.sentence-1)
[4](#4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/preprocessor.tex#L2451)
If any of the pre-defined macro names in this subclause,
or the identifierdefined,
is the subject of a#define or a#undef preprocessing directive,
the program is ill-formed[.](#4.sentence-1)
Any other predefined macro names shall begin with a
leading underscore followed by an uppercase letter or a second
underscore[.](#4.sentence-2)
[129)](#footnote-129)[129)](#footnoteref-129)
The presumed source file name can be changed by the #line directive[.](#footnote-129.sentence-1)
[130)](#footnote-130)[130)](#footnoteref-130)
The presumed line number can be changed by the #line directive[.](#footnote-130.sentence-1)