Features
Changes integrated into the latest working draft of C23 are listed below.Standard Library
New functions
* Addmemset_explicit()
function in < string.h>
to erase sensitive data, where memory store must always be performed regardless of optimizations.
* Add memccpy()
function in
to efficiently concatenate strings – similar to strdup()
and strndup()
functions in
to allocate a copy of a string – similar to memalignment()
function in < stdlib.h>
to determine the byte alignment of a pointer.
* Add bit utility functions / macros / types in new header < stdbit.h>
to examine many integer types. All start with stdc_
to minimize conflict with legacy code and 3rd party libraries.
** In the following, replace *
with uc
, us
, ui
, ul
, ull
for five function names, or blank for a type-generic macro.
** Add stdc_count_ones*()
and stdc_count_zeros*()
to count number of 1 or 0 bits in value.
** Add stdc_leading_ones*()
and stdc_leading_zeros*()
to count leading 1 or 0 bits in value.
** Add stdc_trailing_ones*()
and stdc_trailing_zeros*()
to count trailing 1 or 0 bits in value.
** Add stdc_first_leading_one*()
and stdc_first_leading_zero*()
to find first leading bit with 1 or 0 in value.
** Add stdc_first_trailing_one*()
and stdc_first_trailing_zero*()
to find first trailing bit with 1 or 0 in value.
** Add stdc_has_single_bit*()
to determine if value is an exact power of 2 (return true if and only if there is a single 1 bit).
** Add stdc_bit_floor*()
to determine the largest integral power of 2 that is not greater than value.
** Add stdc_bit_ceil*()
to determine the smallest integral power of 2 that is not less than value.
** Add stdc_bit_width*()
to determine number of bits to represent a value.
* Add timegm()
function in < time.h>
to convert time structure into calendar time value - similar to function in glibc and musl libraries.
* New < math.h>
functions based on IEEE 754-2019 recommendations, such as trigonometry functions operating on units of and exp10
.
Existing functions
* Add%b
binary conversion specifier to printf()
function family.
* Add %b
binary conversion specifier to scanf()
function family.
* Add 0b
and 0B
binary conversion support to strtol()
and wcstol()
function families.
* Make the functions bsearch()
, bsearch_s()
, memchr()
, strchr()
, strpbrk()
, strrchr()
, strstr()
, and their wide counterparts wmemchr()
, wcschr()
, wcspbrk()
, wcsrchr()
, wcsstr()
return a const qualified object if one was passed to them.
Preprocessor
* Add and directives, which are essentially equivalent to and . Both directives were added to standard and GCC 12. * Add directive for binary resource inclusion and allowing the availability of a resource to be checked by preprocessor directives. * Add directive for diagnostics. * Add allowing the availability of a header to be checked by preprocessor directives. * Add allowing the availability of an attribute to be checked by preprocessor directives. (see " compatibility" group for new attribute feature) * Add functional macro for variadic macros which expands to its argument only if a variadic argument has been passed to the containing macro.Types
* Add , ackd_add()
, ckd_sub()
, ckd_mul()
macros for checked integer operations.
* Variably-modified types (but not const
with arrays.
* Standardization of the typeof(...)
operator.
* The meaning of the keyword was changed to cause type inference while also retaining its old meaning of a storage class specifier if used alongside a type. Unlike C++, C23 allows type inference only for object definitions (no inferring function return type or function parameter type).
* Compatibility rules for structure, union, and enumerated types were changed to allow a redeclaration of a compatible type with the same tag.
* Exact-width integer may now exceed (N2888).
Constants
* Add constant fornullptr_t
type.
* Add wb
and uwb
integer literal suffixes for and types, such as yields an unsigned _BitInt(3)
, and yields a signed _BitInt(4)
which has three value bits and one sign bit.
* Add 0b
and 0B
binary literal constant prefixes, such as (equating to 0xAA).
* Add '
digit separator to literal constants, such as (equating to 0xFEDCBA98), (equating to 299792458), (equating to 1.414213562).
* Add the ability to specify the underlying type of an enum
.
* Allow s with no fixed underlying type to store values that are not representable by .
Keywords
* Add and keywords. * Add , , , , keywords. Previously defined keywords become alternative spellings: , , , , . * Add keyword (see "types" group) * Add and keywords (see "types" group) * Add keyword (see "constants" group) * Add keyword (see "other" group) * Add , , keywords for (optional) decimal floating-point arithmetic (see "other" group)Syntax
* Labels can appear before declarations and at the end of compound statements. * Unnamed parameters in function definitions. * Zero initialization with
(including initialization of VLAs).
* Variadic functions no longer need a named argument before the ellipsis and the macro no longer needs a second argument nor does it evaluate any argument after the first one if present.
* Add unsequenced
allows compiler optimizations for functions producing repeatable outputs only based on their parameters
** reproducible
, similar to unsequenced
, but for functions whose call order also matters
* Add single-argument _Static_assert
for compatibility with C++17.
* Functions with no arguments listed in the prototype (e.g. void foo()
) are understood as taking no arguments (see removal of K&R function declarations)
C++ compatibility
* Various syntax changes improve compatibility with C++, such as
, variadic functions without named argument, _Static_assert
(see Syntax). For
features introduced in C11. Duplicate attributes are allowed for compatibility with C++23. All standard attributes can also be surrounded by double underscores (e.g. is equivalent to ).
* Add u8
prefix for character literals to represent Other features
* Support for the ISO/IEC 60559:2020, the current version of the IEEE 754 standard for floating-point arithmetic, with extended binary floating-point arithmetic and (optional) decimal floating-point arithmetic. * The constexpr
specifier for objects but not functions, unlike C++'s equivalent.
* Add type for storing mbrtoc8()
and c8rtomb()
to convert a narrow multibyte character to UTF-8 encoding and a single code point from UTF-8 to a narrow multibyte character representation respectively.
* Clarify that all strings and literals shall be UTF-16 encoded, and all strings and literals shall be UTF-32 encoded, unless otherwise explicitly specified.
* Allow storage class specifiers to appear in compound literal definition.
Obsolete features
Some old obsolete features are either removed or deprecated from the working draft of C23: :* Remove trigraphs. :* Remove K&R function definitions/declarations (with no information about the function arguments). :* Remove representations for signed integers other than two's complement. Two's complement signed integer representation will be required. :* The macros in
are obsolescent features.
Compiler support
The following compilers implement an experimental compiler flag to support this standard: * GCC 9, *Available texts
Like other editions of the C standard, the official ISO text of the standard is not freely available. The latest working draft pre-C23 that was made public was N3096, dated 2023-04-01. In the months that followed this draft, hundreds of changes were made before producing the working draft N3149 dated 2023-07-09 and the official draft standard N3219 dated 2024-02-22. Neither of these later drafts are public. On the same date that the draft standard N3219 was announced, a new working draft N3220 was made public. While this document is officially described as a draft of the future version "C2Y" of the standard, the accompanying "Editor's Report" specifies that N3220 differs from the draft C23 standard N3219 only by a fix to one footnote in Annex K.See also
* C++23, C++20, C++17, C++14,References
Further reading
External links