Difference between revisions of "c/23"
From cppreference.com
< c
(Update link for nullptr_t) |
m (-✅, -❌) |
||
(14 intermediate revisions by 7 users not shown) | |||
Line 4: | Line 4: | ||
The next generation of the C standard. | The next generation of the C standard. | ||
− | + | * {{stddoc latest draft|The latest publicly available WD of C23}} ({{stdinfo latest draft docnum}}, {{stdinfo latest draft docdate}}). | |
+ | * {{stddoc|N3149.zip|The latest WD of C23}} (n3149, 2023-07-09, a password-protected zip archive, see {{stddoc|n3150.htm|n3150}}). | ||
− | {{todo| accepted changes not yet included in the working draft}} | + | {{todo|accepted changes not yet included in the working draft}} |
− | == Obsolete == | + | ==Obsolete== |
===Removed=== | ===Removed=== | ||
* Old-style function [[c/language/function declaration|declarations]] and [[c/language/function definition|definitions]] | * Old-style function [[c/language/function declaration|declarations]] and [[c/language/function definition|definitions]] | ||
* Representations for [[c/language/arithmetic types|signed integers]] other than two's complement | * Representations for [[c/language/arithmetic types|signed integers]] other than two's complement | ||
− | * Permission that {{c|u}}/{{c|U}}-prefixed | + | * Permission that {{c|u}}/{{c|U}}-prefixed {{lt|c/language/character constant}}s and {{lt|c/language/string literal}}s may be not UTF-16/32 |
* Mixed wide [[c/language/string literal|string literal]] concatenation | * Mixed wide [[c/language/string literal|string literal]] concatenation | ||
* Support for calling {{ltf|c/memory/realloc}} with zero size (the behavior becomes undefined) | * Support for calling {{ltf|c/memory/realloc}} with zero size (the behavior becomes undefined) | ||
* {{ltt|c/types|__alignof_is_defined}} and {{ltt|c/types|__alignas_is_defined}} | * {{ltt|c/types|__alignof_is_defined}} and {{ltt|c/types|__alignas_is_defined}} | ||
+ | * {{ltt|c/error/static_assert}} is not provided as a macro defined in {{header|assert.h}} (becomes a keyword) | ||
+ | * {{ltt|c/thread/thread_local}} is not provided as a macro defined in {{header|threads.h}} (becomes a keyword) | ||
===Deprecated=== | ===Deprecated=== | ||
+ | * {{header|stdnoreturn.h}} | ||
* Old feature-test macros | * Old feature-test macros | ||
** {{ltt|c/preprocessor/replace|__STDC_IEC_559__}} | ** {{ltt|c/preprocessor/replace|__STDC_IEC_559__}} | ||
Line 26: | Line 30: | ||
* {{lc|asctime()}} | * {{lc|asctime()}} | ||
* {{lc|ctime()}} | * {{lc|ctime()}} | ||
− | * {{ltt|c/types/limits|DECIMAL_DIG}} | + | * {{ltt|c/types/limits|DECIMAL_DIG}} (use the appropriate type-specific macro ({{ltt|c/types/limits#Limits of floating-point types|FLT_DECIMAL_DIG}}, etc) instead) |
− | * Definition of following numeric limit macros in {{ | + | * Definition of following numeric limit macros in {{header|math.h}} (they should be used via {{header|float.h}}) |
** {{ltt|c/numeric/math|INFINITY}} | ** {{ltt|c/numeric/math|INFINITY}} | ||
** {{ltt|c/numeric/math|DEC_INFINITY}} | ** {{ltt|c/numeric/math|DEC_INFINITY}} | ||
Line 34: | Line 38: | ||
* {{ltt|c/types|__bool_true_false_are_defined}} | * {{ltt|c/types|__bool_true_false_are_defined}} | ||
− | == New language features == | + | ==New language features== |
* [[c/language/arithmetic types|Decimal floating-point types]] ({{ltt|c/keyword/_Decimal32}}, {{ltt|c/keyword/_Decimal64}}, and {{ltt|c/keyword/_Decimal128}}) | * [[c/language/arithmetic types|Decimal floating-point types]] ({{ltt|c/keyword/_Decimal32}}, {{ltt|c/keyword/_Decimal64}}, and {{ltt|c/keyword/_Decimal128}}) | ||
− | * [[c/language/arithmetic types|Bit-precise integers]] ({{ltt|c/keyword/_BitInt | + | * [[c/language/arithmetic types|Bit-precise integers]] ({{ltt|c/keyword/_BitInt}}) |
* [[c/language/integer constant|Binary integer constants]] | * [[c/language/integer constant|Binary integer constants]] | ||
* [[c/language/character constant|{{tt|u8}} character constants]] | * [[c/language/character constant|{{tt|u8}} character constants]] | ||
* Type change of [[c/language/string literal|{{tt|u8}} string literals]] | * Type change of [[c/language/string literal|{{tt|u8}} string literals]] | ||
* Digit separator {{tt|'}} | * Digit separator {{tt|'}} | ||
− | * Empty [[c/language/initialization|initializer]] {{c|1== {} }} | + | * Empty [[c/language/initialization|initializer]] {{c|1=={}<!---->}} |
* [[c/language/attributes|Attributes]] | * [[c/language/attributes|Attributes]] | ||
− | ** {{ | + | ** {{attr|deprecated}} |
− | ** {{ | + | ** {{attr|fallthrough}} |
− | ** {{ | + | ** {{attr|maybe_unused}} |
− | ** {{ | + | ** {{attr|nodiscard}} |
− | ** {{ | + | ** {{attr|noreturn}} |
− | ** {{ | + | ** {{attr|reproducible}} |
− | ** {{ | + | ** {{attr|unsequenced}} |
− | * Unnamed parameters in | + | * Unnamed parameters in {{lt|c/language/function definition}}s |
* Identical cvr-qualifications for [[c/language/array|array types]] and their element types | * Identical cvr-qualifications for [[c/language/array|array types]] and their element types | ||
* Single-argument {{ltt|c/language/_Static_assert}} | * Single-argument {{ltt|c/language/_Static_assert}} | ||
+ | * {{ltt|c/keyword/static_assert}} becomes a keyword (may be a predefined macro for compatibility reasons) | ||
+ | * {{ltt|c/keyword/thread_local}} becomes a keyword (may be a predefined macro for compatibility reasons) | ||
* [[c/language/goto|Labels]] followed by declarations and {{ttb|}<nowiki/>}} | * [[c/language/goto|Labels]] followed by declarations and {{ttb|}<nowiki/>}} | ||
* {{ltt|c/keyword/nullptr}} constant and the associated {{ltt|c/types/nullptr_t}} type | * {{ltt|c/keyword/nullptr}} constant and the associated {{ltt|c/types/nullptr_t}} type | ||
− | * {{ltt|true}} and {{ltt|false}} become keywords (may be predefined macros for compatibility reasons) | + | * {{ltt|c/keyword/true}} and {{ltt|c/keyword/false}} become keywords (may be predefined macros for compatibility reasons) |
* New preprocessor directives | * New preprocessor directives | ||
** {{ltt|c/preprocessor/conditional|#elifdef}} | ** {{ltt|c/preprocessor/conditional|#elifdef}} | ||
** {{ltt|c/preprocessor/conditional|#elifndef}} | ** {{ltt|c/preprocessor/conditional|#elifndef}} | ||
** {{ltt|c/preprocessor/error|#warning}} | ** {{ltt|c/preprocessor/error|#warning}} | ||
− | ** {{ | + | ** {{ltt|c/preprocessor/embed|#embed}} |
* Pragmas for rounding direction | * Pragmas for rounding direction | ||
** {{tt|STDC}} {{ltt|c/preprocessor/impl|FENV_ROUND}} | ** {{tt|STDC}} {{ltt|c/preprocessor/impl|FENV_ROUND}} | ||
Line 75: | Line 81: | ||
*: This macro supersedes {{ltt|c/preprocessor/replace|__STDC_IEC_559_COMPLEX__}}. | *: This macro supersedes {{ltt|c/preprocessor/replace|__STDC_IEC_559_COMPLEX__}}. | ||
− | == New library features == | + | ==New library features== |
+ | |||
+ | ===New headers=== | ||
+ | * {{header|stdbit.h}} | ||
+ | * {{header|stdckdint.h}} | ||
+ | |||
+ | ===Library features=== | ||
* Extended binary floating-point math functions | * Extended binary floating-point math functions | ||
** {{todo|List TBD}} | ** {{todo|List TBD}} | ||
Line 95: | Line 107: | ||
** {{ltt|c/thread|atomic_char8_t}} type alias | ** {{ltt|c/thread|atomic_char8_t}} type alias | ||
** {{ltt|c/atomic/ATOMIC_LOCK_FREE_consts|ATOMIC_CHAR8_T_LOCK_FREE}} test macro | ** {{ltt|c/atomic/ATOMIC_LOCK_FREE_consts|ATOMIC_CHAR8_T_LOCK_FREE}} test macro | ||
+ | * {{ltf|c/string/byte/memset|memset_explicit}} | ||
* POSIX functions | * POSIX functions | ||
** {{ltf|c/string/byte/memccpy}} | ** {{ltf|c/string/byte/memccpy}} | ||
Line 103: | Line 116: | ||
** Extensions for {{ltf|c/chrono/strftime}} and {{ltf|c/chrono/wcsftime}} | ** Extensions for {{ltf|c/chrono/strftime}} and {{ltf|c/chrono/wcsftime}} | ||
* Extensions for {{ltf|c/io/fscanf}} and {{ltf|c/io/fprintf}} function families | * Extensions for {{ltf|c/io/fscanf}} and {{ltf|c/io/fprintf}} function families | ||
− | ** {{tt|w''N''}} and {{tt|wf''N''}} length modifiers for {{ltt|c/types/integer|[u]int''N''_t}} and {{ltt|c/types/integer|[u]int_fast''N''_t}} respectively | + | ** {{tt|w''N''}} and {{tt|wf''N''}} length modifiers for {{ltt|c/types/integer|[u]int''N''_t}} and {{ltt|c/types/integer|[u]int_fast''N''_t}} respectively |
** {{tt|H}}, {{tt|D}}, and {{tt|DD}} length modifiers for {{c|_Decimal32}}, {{c|_Decimal64}}, and {{c|_Decimal128}} respectively | ** {{tt|H}}, {{tt|D}}, and {{tt|DD}} length modifiers for {{c|_Decimal32}}, {{c|_Decimal64}}, and {{c|_Decimal128}} respectively | ||
** {{tt|b}} conversion specifier for unsigned integer types | ** {{tt|b}} conversion specifier for unsigned integer types | ||
Line 116: | Line 129: | ||
** {{ltt|c/numeric/tgmath|__STDC_VERSION_TGMATH_H__}} | ** {{ltt|c/numeric/tgmath|__STDC_VERSION_TGMATH_H__}} | ||
** {{ltt|c/chrono|__STDC_VERSION_TIME_H__}} | ** {{ltt|c/chrono|__STDC_VERSION_TIME_H__}} | ||
+ | ** {{ltt|__STDC_VERSION_STDCKDINT_H__}} | ||
+ | ** {{ltt|__STDC_VERSION_STDBIT_H__}} | ||
− | == Defect reports == | + | ==Defect reports== |
{{c/language/history/DR23}} | {{c/language/history/DR23}} | ||
− | == Compiler support == | + | ==Compiler support== |
{{c/compiler support/23}} | {{c/compiler support/23}} | ||
{{langlinks|ar|cs|de|es|fr|it|ja|ko|pl|pt|ru|tr|zh}} | {{langlinks|ar|cs|de|es|fr|it|ja|ko|pl|pt|ru|tr|zh}} |
Latest revision as of 21:39, 9 February 2024
The next generation of the C standard.
- The latest publicly available WD of C23 (n3301, 2024-07-28).
- The latest WD of C23 (n3149, 2023-07-09, a password-protected zip archive, see n3150).
This section is incomplete Reason: accepted changes not yet included in the working draft |
Contents |
[edit] Obsolete
[edit] Removed
- Old-style function declarations and definitions
- Representations for signed integers other than two's complement
- Permission that u/U-prefixed character constants and string literals may be not UTF-16/32
- Mixed wide string literal concatenation
- Support for calling realloc() with zero size (the behavior becomes undefined)
- __alignof_is_defined and __alignas_is_defined
- static_assert is not provided as a macro defined in <assert.h> (becomes a keyword)
- thread_local is not provided as a macro defined in <threads.h> (becomes a keyword)
[edit] Deprecated
- <stdnoreturn.h>
- Old feature-test macros
- _Noreturn function specifier
- _Noreturn attribute token
- asctime()
- ctime()
- DECIMAL_DIG (use the appropriate type-specific macro (FLT_DECIMAL_DIG, etc) instead)
- Definition of following numeric limit macros in <math.h> (they should be used via <float.h>)
- __bool_true_false_are_defined
[edit] New language features
- Decimal floating-point types (_Decimal32, _Decimal64, and _Decimal128)
- Bit-precise integers (_BitInt)
- Binary integer constants
-
u8
character constants - Type change of
u8
string literals - Digit separator
'
- Empty initializer ={}
- Attributes
-
[[deprecated]]
-
[[fallthrough]]
-
[[maybe_unused]]
-
[[nodiscard]]
-
[[noreturn]]
-
[[reproducible]]
-
[[unsequenced]]
-
- Unnamed parameters in function definitions
- Identical cvr-qualifications for array types and their element types
- Single-argument _Static_assert
- static_assert becomes a keyword (may be a predefined macro for compatibility reasons)
- thread_local becomes a keyword (may be a predefined macro for compatibility reasons)
- Labels followed by declarations and
}
- nullptr constant and the associated nullptr_t type
- true and false become keywords (may be predefined macros for compatibility reasons)
- New preprocessor directives
- Pragmas for rounding direction
-
STDC
FENV_ROUND -
STDC
FENV_DEC_ROUND
-
[edit] Feature test macros for optional features
- __STDC_IEC_60559_BFP__
- Indicates IEEE-754 binary floating-point arithmetic and required math functions are supported.
- This macro supersedes __STDC_IEC_559__.
- __STDC_IEC_60559_DFP__
- Indicates IEEE-754 decimal floating-point arithmetic and required math functions are supported.
- __STDC_IEC_60559_COMPLEX__
- Indicates IEEE-754 complex arithmetic and required math functions are supported.
- This macro supersedes __STDC_IEC_559_COMPLEX__.
[edit] New library features
[edit] New headers
- <stdbit.h>
- <stdckdint.h>
[edit] Library features
- Extended binary floating-point math functions
-
This section is incomplete
Reason: List TBD
-
- Decimal floating-point math functions
- -
dN
variants for existing and new floating-point math functions - quantizedN()
- samequantumdN()
- quantumdN()
- llquantexpdN()
- encodedecdN()
- decodedecdN()
- encodebindN()
- decodebindN()
- -
- Floating-point formatting functions
- Library support for UTF-8
-
char8_t
type alias - mbrtoc8()
- c8rtomb()
- atomic_char8_t type alias
- ATOMIC_CHAR8_T_LOCK_FREE test macro
-
- memset_explicit()
- POSIX functions
- memccpy()
- strdup()
- strndup()
- gmtime_r()
- localtime_r()
- Extensions for strftime() and wcsftime()
- Extensions for fscanf() and fprintf() function families
-
wN
andwfN
length modifiers for [u]intN_t and [u]int_fastN_t respectively -
H
,D
, andDD
length modifiers for _Decimal32, _Decimal64, and _Decimal128 respectively -
b
conversion specifier for unsigned integer types
-
- timespec_getres()
- Macro constants for width of integer types
- Additional numeric limit macros for floating-point types
- Library version-test macros
[edit] Defect reports
Defect Reports fixed in C23 (? defects) |
---|
[edit] Compiler support
[edit] C23 core language features
This section is incomplete Reason: status for Apple Clang and other compilers supporting C2x |
C23 feature |
Paper(s) |
GCC |
Clang |
MSVC |
Apple Clang |
EDG eccp |
Intel C++ |
IBM XL C++ |
IBM Open XL C++ for AIX |
IBM Open XL C++ for z/OS |
Sun/Oracle C++ |
Embarcadero C++ Builder |
Cray |
Nvidia HPC C++ (ex PGI)* |
Nvidia nvcc |
|
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
_Static_assert with no message | N2265 | 9 | 9 | Yes | Yes | 6.5 | 2021.1.2 (clang based) | |||||||||
[[nodiscard]]
|
N2267 | 10 | 9 | Yes | 6.4 | 2021.1.2 (clang based) | ||||||||||
[[maybe_unused]]
|
N2270 | 10 | 9 | Yes | 6.4 | 2021.1.2 (clang based) | ||||||||||
[[deprecated]]
|
N2334 | 10 | 9 | Yes | 6.4 | 2021.1.2 (clang based) | ||||||||||
Attributes | N2335 N2554 |
10 | 9 | Yes | 6.4 | 2021.1.2 (clang based) | ||||||||||
IEEE 754 decimal floating-point types | N2341 | 4.2 (partial)* 12 |
13.0 (partial)* | |||||||||||||
[[fallthrough]]
|
N2408 | 10 | 9 | Yes | 6.4 | 2021.1.2 (clang based) | ||||||||||
u8 character constants
|
N2418 | 10 | 15 | 6.5 | 2022.2 | |||||||||||
Removal of function definitions without prototype | N2432 | 10 | 15 | 2022.2 | ||||||||||||
[[nodiscard]] with message
|
N2448 | 11 | 10 | Yes | 6.4 | 2021.1.2 (clang based) | ||||||||||
Unnamed parameters in function definitions | N2480 | 11 | 11 | Yes | 6.4 | 2021.1.2 (clang based) | ||||||||||
Labels before declarations and end of blocks | N2508 | 11 | 16 | Partial* | 6.5 | 17.0* | ||||||||||
Binary integer constants | N2549 | 4.3* 11 |
2.9* 9 |
19.0 (2015)** | Yes | 6.5 | 11.0* | |||||||||
__has_c_attribute in preprocessor conditionals | N2553 | 11 | 9 | Yes | 6.5 | 2021.1.2 (clang based) | ||||||||||
Allow duplicate attributes | N2557 | 11 | 13 | Yes | 6.5 | 2021.4 (clang-based | ||||||||||
IEEE 754 interchange and extended types | N2601 | 7 (partial)* 14 |
6 (partial)* | Partial* | ||||||||||||
Digit separators | N2626 | 12 | 13 | 19.0 (2015)** | Yes | 6.5 | 18.0* | |||||||||
#elifdef and #elifndef
|
N2645 | 12 | 13 | 19.40* |
13.1.6* |
6.5 | 2021.4 | |||||||||
Type change of u8 string literals
|
N2653 | 13 | ||||||||||||||
[[maybe_unused]] for labels
|
N2662 | 11 | 16 | 6.5 | 2022.2 | |||||||||||
#warning | N2686 | Yes | Yes | Yes | 6.5 | Yes | ||||||||||
Bit-precise integer types (_BitInt) | N2763 | 14 (partial)* | 15 | 6.5 | 2022.2 | |||||||||||
[[noreturn]]
|
N2764 | 13 | 15 | 6.5 | 2022.2 | |||||||||||
Suffixes for bit-precise integer constants | N2775 | 14 | 15 | 2022.2 | ||||||||||||
__has_include in preprocessor conditionals | N2799 | 5 | Yes | 19.11* | Yes | 6.5 | 18.0 | |||||||||
Identifier Syntax using Unicode Standard Annex 31 | N2836 | 13 | 15 | 6.5 | 2022.2 | |||||||||||
Removal of function declarations without prototype | N2841 | 13 | 15 | 2022.2 |
| |||||||||||
Empty initializers | N2900 | Partial* 13 |
Partial* | Partial* | Partial* | Partial* |
| |||||||||
typeof and typeof_unqual | N2927 N2930 |
Partial* 13 |
Partial* 16 |
19.39* | Partial* | Partial* | Partial* | Partial* | ||||||||
New spelling of keywords | N2934 | 13 | 16 | 6.5 | ||||||||||||
Predefined true and false
|
N2935 | 13 | 15 | 2022.2 | ||||||||||||
[[unsequenced]] and [[reproducible]]
|
N2956 | 15 | ||||||||||||||
Relax requirements for variadic parameter list | N2975 | 13 | 16 | 6.5 | 2023.1 | |||||||||||
Type inference in object definitions | N3007 | 13 | 18 | |||||||||||||
#embed | N3017 | 15 | 19 | |||||||||||||
constexpr objects | N3018 | 13 | 19 | |||||||||||||
Improved Normal Enumerations | N3029 | 13 | 20* | |||||||||||||
Enumerations with fixed underlying types | N3030 | 13 | 20* | |||||||||||||
__VA_OPT__
|
N3033 | 8 13 |
12 | 19.39* | 6.5 | |||||||||||
Storage-class specifiers for compound literals | N3038 | 13 | ||||||||||||||
nullptr | N3042 | 13 | 16 | |||||||||||||
C23 feature |
Paper(s) |
GCC |
Clang |
MSVC |
Apple Clang |
EDG eccp |
Intel C++ |
IBM XL C++ |
IBM Open XL C++ for AIX |
IBM Open XL C++ for z/OS |
Sun/Oracle C++ |
Embarcadero C++ Builder |
Cray |
Nvidia HPC C++ (ex PGI)* |
Nvidia nvcc |
[edit] C23 library features
This section is incomplete Reason: a different list for C standard libraries |