C23 (C standard revision)

C23 is the informal name for ISO/IEC 9899:2024, the next standard for the C programming language, which will replace C17 (standard ISO/IEC 9899:2018). It was started in 2016 informally as C2x, and was expected to be published in 2024. The most recent publicly available working draft of C23 was released on April 1, 2023. The first WG14 meeting for the C2x draft was held in October 2019, virtual remote meetings were held in 2020 due to the COVID-19 pandemic, then various teleconference meetings continued to occur through 2024.

Features
Changes integrated into the latest working draft of C23 are listed below.

New functions

 * Add  function in   to erase sensitive data, where memory store must always be performed regardless of optimizations.
 * Add  function in   to efficiently concatenate strings – similar to POSIX and SVID C extensions.
 * Add  and   functions in   to allocate a copy of a string – similar to POSIX and SVID C extensions.
 * Add  function in   to determine the byte alignment of a pointer.
 * Add bit utility functions / macros / types in new header  to examine many integer types.  All start with   to minimize conflict with legacy code and 3rd party libraries.
 * In the following, replace  with ,  ,  ,  ,   for five function names, or blank for a type-generic macro.
 * Add  and   to count number of 1 or 0 bits in value.
 * Add  and   to count leading 1 or 0 bits in value.
 * Add  and   to count trailing 1 or 0 bits in value.
 * Add  and   to find first leading bit with 1 or 0 in value.
 * Add  and   to find first trailing bit with 1 or 0 in value.
 * Add  to determine if value is an exact power of 2 (return true if and only if there is a single 1 bit).
 * Add  to determine the largest integral power of 2 that is not greater than value.
 * Add  to determine the smallest integral power of 2 that is not less than value.
 * Add  to determine number of bits to represent a value.
 * Add  function in   to convert time structure into calendar time value - similar to function in glibc and musl libraries.
 * New  functions based on IEEE 754-2019 recommendations, such as trigonometry functions operating on units of $$\pi x$$ and.

Existing functions

 * Add  binary conversion specifier to   function family.
 * Add  binary conversion specifier to   function family.
 * Add  and   binary conversion support to   and   function families.
 * Make the functions,  ,  ,  ,  ,  ,  , and their wide counterparts  ,  ,  ,  ,   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 C++23 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 "C++ 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 nullptr_t, a null pointer type.
 * Add and  types for bit-precise integers. Add  macro for maximum bit width.
 * Add,  ,   macros for checked integer operations.
 * Variably-modified types (but not VLAs which are automatic variables allocated on the stack) become a mandatory feature.
 * Better support for using  with arrays.
 * Standardization of the  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 intmax_t (N2888).

Constants

 * Add nullptr constant for  type.
 * Add  and   integer literal suffixes for  and  types, such as  yields an , and  yields a   which has three value bits and one sign bit.
 * Add  and   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.
 * Allow s with no fixed underlying type to store values that are not representable by.

Keywords

 * Add and  keywords.
 * Add, , , , thread_local 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 C++11 style attribute syntax using double square brackets . In addition to C++11 attributes listed below, add new attributes:
 * allows compiler optimizations for functions producing repeatable outputs only based on their parameters
 * , similar to, but for functions whose call order also matters
 * Add single-argument  for compatibility with C++17.
 * Functions with no arguments listed in the prototype  are understood as taking no arguments (see removal of K&R function declarations)

C++ compatibility

 * Various syntax changes improve compatibility with C++, such as labels before declarations, unnamed function arguments, zero initialization with, variadic functions without named argument, C++11 style attributes,   (see Syntax). For labels at the end of compound statements a corresponding change was made to C++23.
 * Add C++-style attributes (see Syntax). Add attributes, , , , and  attribute for compatibility with C++11, then deprecate , , header   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  prefix for character literals to represent UTF-8 encoding for compatibility with C++17.
 * Add and  preprocessing directives for compatibility with C++23. (see "preprocessor" group)

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  specifier for objects but not functions, unlike C++'s equivalent.
 * Add type for storing UTF-8 encoded data and change the type of u8 character constants and string literals to . Also, the functions   and   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 GCC 9, Clang 9.0, and Pelles C 11.00 compilers implement an experimental compiler flag to support this standard.