C23 (C standard revision)

From HandWiki
Short description: C programming language standard, future revision


C23 is the informal name for what will likely become ISO/IEC 9899:2024, the next standard for the C programming language, which will replace C17 (standard ISO/IEC 9899:2018).[1] It was started in 2016 informally as C2x,[2] and expected to be published in 2024.[3] The most recent publicly available working draft of C23 was released on April 1, 2023.[4] The first WG14 meeting for the C2x draft was held in October 2019,[5] 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.[4]

Standard Library

New functions

  • Add memset_explicit() function in <string.h> to erase sensitive data, where memory store must always be performed regardless of optimizations.[6]
  • Add memccpy() function in <string.h> to efficiently concatenate strings – similar to POSIX and SVID C extensions.[7]
  • Add strdup() and strndup() functions in <string.h> to allocate a copy of a string – similar to POSIX and SVID C extensions.[8]
  • Add memalignment() function in <stdlib.h> to determine the byte alignment of a pointer.[9]
  • 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.[10]
    • In the following, replace * with uc, us, ui, ul, ull for five function names, or blank for a type-generic macro.[10]
    • Add stdc_count_ones*() and stdc_count_zeros*() to count number of 1 or 0 bits in value.[10]
    • Add stdc_leading_ones*() and stdc_leading_zeros*() to count leading 1 or 0 bits in value.[10]
    • Add stdc_trailing_ones*() and stdc_trailing_zeros*() to count trailing 1 or 0 bits in value.[10]
    • Add stdc_first_leading_one*() and stdc_first_leading_zero*() to find first leading bit with 1 or 0 in value.[10]
    • Add stdc_first_trailing_one*() and stdc_first_trailing_zero*() to find first trailing bit with 1 or 0 in value.[10]
    • Add stdc_has_single_bit*() to determine if value an exact power of 2 (return true if and only if there is a single 1 bit).[10]
    • Add stdc_bit_floor*() to determine the largest integral power of 2 that is not greater than value.[10]
    • Add stdc_bit_ceil*() to determine the smallest integral power of 2 that is not less than value.[10]
    • Add stdc_bit_width*() to determine number of bits to represent a value.[10]
  • Add timegm() function in <time.h> to convert time structure into calendar time value - similar to function in glibc and musl libraries.[11]

Existing functions

  • Add %b binary conversion specifier to printf() function family, prepending non-zero values with 0b, similar to how %x works. Implementations that previously did not use %B as their own extension are encouraged to implement and prepend non-zero values with 0B, similar to how %X works.[12]
  • Add %b binary conversion specifier to scanf() function family.[12]
  • Add 0b and 0B binary conversion support to strtol() and wcstol() function families.[12]
  • 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.[13]

Preprocessor

  • Add
    #elifdef
    and
    #elifndef
    directives,[14] which are essentially equivalent to
    #elif defined
    and
    #elif !defined
    . Both directives were added to C++23 standard and GCC 12.[15]
  • Add
    #embed
    directive for binary resource inclusion and
    __has_embed
    allowing the availability of a resource to be checked by preprocessor directives.[16]
  • Add
    #warning
    directive for diagnostics.[17]
  • Add
    __has_include
    allowing the availability of a header to be checked by preprocessor directives.[18]
  • Add
    __has_c_attribute
    allowing the availability of an attribute to be checked by preprocessor directives.[19] (see "C++ compatibility" group for new attribute feature)
  • Add
    __VA_OPT__
    functional macro for variadic macros which expands to its argument only if a variadic argument has been passed to the containing macro.[20]

Types

  • Add nullptr t, a null pointer type.[21]
  • Add
    _BitInt(N)
    and
    unsigned _BitInt(N)
    types for bit-precise integers. Add
    BITINT_MAXWIDTH
    macro for maximum bit width.[22][23]
  • Add ckd_add(), ckd_sub(), ckd_mul() macros for checked integer operations.[24]
  • Variably-modified types (but not VLAs which are automatic variables allocated on the stack) become a mandatory feature.[25]
  • Better support for using const with arrays.[26]
  • Standardization of the typeof(...) operator.[27]
  • The meaning of the
    auto
    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).[28]
  • Compatibility rules for structure, union, and enumerated types were changed to allow a redeclaration of a compatible type with the same tag.[29]

Constants

  • Add nullptr constant for nullptr_t type.[21]
  • Add wb and uwb integer literal suffixes for
    _BitInt(N)
    and
    unsigned _BitInt(N)
    types,[30] such as
    6uwb
    yields an unsigned _BitInt(3), and
    -6wb
    yields a signed _BitInt(4) which has three value bits and one sign bit.
  • Add 0b and 0B binary literal constant prefixes,[31] such as
    0b10101010
    (equating to 0xAA).
  • Add ' digit separator to literal constants,[32] such as
    0xFE'DC'BA'98
    (equating to 0xFEDCBA98),
    299'792'458
    (equating to 299792458),
    1.414'213'562
    (equating to 1.414213562).
  • Add the ability to specify the underlying type of an enum.[33]
  • Allow
    enum
    s with no fixed underlying type to store values that are not representable by
    int
    .[34]

Keywords

  • Add
    true
    and
    false
    keywords.[35]
  • Add
    alignas
    ,
    alignof
    ,
    bool
    ,
    static_assert
    , thread local keywords. Previously defined keywords become alternative spellings:
    _Alignas
    ,
    _Alignof
    ,
    _Bool
    ,
    _Static_assert
    ,
    _Thread_local
    .[36]
  • Add
    _BitInt
    keyword (see "types" group)
  • Add
    typeof
    and
    typeof_unqual
    keywords (see "types" group)
  • Add
    nullptr
    keyword (see "constants" group)
  • Add
    constexpr
    keyword (see "other" group)
  • Add
    _Decimal32
    ,
    _Decimal64
    ,
    _Decimal128
    keywords for (optional) decimal floating-point arithmetic (see "other" group)

Syntax

  • Labels can appear before declarations and at the end of compound statements.[37]
  • Unnamed parameters in function definitions.[38]
  • Zero initialization with {} (including initialization of VLAs).[39]
  • Variadic functions no longer need a named argument before the ellipsis and the
    va_start
    macro no longer needs a second argument nor does it evaluate any argument after the first one if present.[40]
  • Add C++11 style attribute syntax[41] using double square brackets
    [[]]
    .
  • Add single-argument Static assert for compatibility with C++17.[42]
  • Functions with no arguments listed in the prototype 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 labels before declarations, unnamed function arguments, zero initialization with {}, variadic functions without named argument, C++11 style attributes, Static assert (see Syntax). For labels at the end of compound statements a corresponding change was made to C++23.[43]
  • Add C++-style attributes (see Syntax). Add attributes [44]
    deprecated
    ,[45]
    fallthrough
    ,[46]
    maybe unused
    ,[47]
    nodiscard
    ,[48] and
    noreturn
    attribute for compatibility with C++11, then deprecate
    _Noreturn
    ,
    noreturn
    , header <stdnoreturn.h> features introduced in C11.[49] Duplicate attributes are allowed for compatibility with C++23.[50] All standard attributes can also be surrounded by double underscores (e.g
    deprecated
    is equivalent to
    deprecated
    ).
  • Add u8 prefix for character literals to represent UTF-8 encoding for compatibility with C++17.[51][52]
  • Add
    #elifdef
    and
    #elifndef
    preprocessing directives for compatibility with C++23.[14] (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.[53][54]
  • The constexpr specifier for objects but not functions, unlike C++'s equivalent.[55]
  • Add
    char8_t
    type for storing UTF-8 encoded data and change the type of u8 character constants and string literals to
    char8_t
    . Also, the functions 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.[56]
  • Clarify that all
    char16_t
    strings and literals shall be UTF-16 encoded, and all
    char32_t
    strings and literals shall be UTF-32 encoded, unless otherwise explicitly specified.[57]
  • Allow storage class specifiers to appear in compound literal definition.[58]

Obsolete features

Some old obsolete features are either removed or deprecated from the working draft of C23:

  • Remove Trigraphs.[59]
  • Remove K&R function definitions/declarations (with no information about the function arguments).[60][61]
  • Remove representations for signed integers other than two's complement. Two's complement signed integer representation will be required.[62]
  • The
    *_HAS_SUBNORM
    macros in <float.h> are obsolescent features.[63]

Compiler support

The GCC 9,[64] Clang 9.0,[65] and Pelles C 11.00[66] compilers implement an experimental compiler flag to support this standard.

See also

References

  1. "History of C". 2022-06-27. https://en.cppreference.com/w/c/language/history. 
  2. "WG14-N2086 : C2x Charter". 2016-09-20. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2086.htm. 
  3. "WG14-N3156 : Updated C23 Schedule". 2023-07-19. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3156.pdf. 
  4. 4.0 4.1 "WG14-N3096 : Draft for ISO/IEC 9899:2023". April 1, 2023. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3096.pdf. 
  5. "WG14-N2437 : Agenda for October 2019". 2019-10-21. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2437.htm. 
  6. "WG14-N2897 : memset_explicit()". 2021-12-27. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2897.htm. 
  7. "WG14-N2349 : Toward more efficient string copying and concatenation". 2019-03-18. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2349.htm. 
  8. "WG14-N2353 : strdup() and strndup()". 2019-03-18. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2353.htm. 
  9. "WG14-N2974 : Queryable pointer alignment". 2022-04-15. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2974.pdf. 
  10. 10.00 10.01 10.02 10.03 10.04 10.05 10.06 10.07 10.08 10.09 10.10 "WG14-N3022 : Modern Bit Utilities". 2022-07-06. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3022.htm. 
  11. "WG14-N2833 : Add timegm() as non-optional part of time.h". 2021-10-07. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2833.htm. 
  12. 12.0 12.1 12.2 "WG14-N2630 : formatted input/output of binary integer numbers". 2021-01-01. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2630.pdf. 
  13. "WG14-N3020 : Qualifier-preserving standard library functions". 2022-06-13. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3020.pdf. 
  14. 14.0 14.1 "WG14-N2645 : Add support for preprocessing directives #elifdef and #elifndef". 2020-01-25. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2645.pdf. 
  15. "GCC 12 Adds Support For New #elifdef #elifndef Directives". May 12, 2021. https://www.phoronix.com/news/GCC-12-elifdef-elifndef. 
  16. "WG14-N3017 : #embed - a scannable, tooling-friendly binary resource inclusion mechanism". 2022-06-27. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3017.htm. 
  17. "WG14-N2686 : #warning". 2022-07-22. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2686.pdf. 
  18. "WG14-N2799 : __has_include for C". 2021-08-30. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2799.pdf. 
  19. "WG14-N2553 : Querying attribute support". 2020-08-04. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2553.pdf. 
  20. "WG14-N3033 : Comma omission and comma deletion". 2022-07-20. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3033.htm. 
  21. 21.0 21.1 "WR14-N3042 : Introduce the nullptr constant". 2022-07-22. https://open-std.org/JTC1/SC22/WG14/www/docs/n3042.htm. 
  22. "WG14-N2763 : Adding a Fundamental Type for N-bit integers". 2021-06-21. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2763.pdf. 
  23. "WG14-N3035 : _BitInt Fixes". 2022-07-21. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3035.pdf. 
  24. "WG14-N2867 : Checked N-Bit Integers". 2021-11-28. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2867.pdf. 
  25. "WG14-N2778 : Variably-Modified Types". 2021-07-11. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2778.pdf. 
  26. "WG14-N2607 : Compatibility of Pointers to Arrays with Qualifiers". 2020-10-31. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2607.pdf. 
  27. "WG14-N2899 : Not-so-magic - typeof for C". 2022-01-21. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2899.htm. 
  28. "WG14-N3007 : Type inference for object definitions". 2022-06-10. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3007.htm. 
  29. "WG14-N3037 : Improved Rules for Tag Compatibility (updates N3032)". https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3037.pdf. 
  30. "WG14-N2775 : Literal suffixes for bit-precise integers". 2021-07-13. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2775.pdf. 
  31. "WG14-N2549 : Allow for binary integer constants". 2020-07-30. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2549.pdf. 
  32. "WG14-N2626 : Digit separators". 2020-12-15. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2626.pdf. 
  33. "WG14-N3030 : Enhancements to Enumerations". 2022-07-19. https://open-std.org/JTC1/SC22/WG14/www/docs/n3030.htm. 
  34. "WG14-N3029 : Improved Normal Enumerations". 2022-07-19. https://open-std.org/JTC1/SC22/WG14/www/docs/n3029.htm. 
  35. "WG14-N2935 : Make false and true first-class language features". 2022-02-15. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2935.pdf. 
  36. "WG14-N2934 : Revise spelling of keywords". 2022-02-15. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2934.pdf. 
  37. "WG14-N2508 : Free Positioning of Labels Inside Compound Statements". 2020-03-28. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2508.pdf. 
  38. "WG14-N2510 : Allowing unnamed parameters in a function definition". 2020-04-09. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2510.pdf. 
  39. "WG14-N2900 : Consistent, Warningless, and Intuitive Initialization with {}". 2022-01-01. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2900.htm. 
  40. "WG14-N2975 : Relax requirements for variadic parameter lists". 2022-04-15. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2975.pdf. 
  41. "WG14-N2335 : Attributes in C". 2019-03-09. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2335.pdf. 
  42. "WG14-N2265 : Harmonizing static_assert with C++". 2018-07-06. https://open-std.org/JTC1/SC22/WG14/www/docs/n2265.pdf. 
  43. "Labels at the end of compound statements (C compatibility)". 2022-01-13. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2324r2.pdf. 
  44. "WG14-N2554 : Minor attribute wording cleanups". 2020-08-04. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2554.pdf. 
  45. "WG14-N2334 : The deprecated attribute". 2019-01-22. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2334.pdf. 
  46. "WG14-N2408 : The fallthrough attribute". 2019-08-11. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2408.pdf. 
  47. "WG14-N2270 : The maybe_unused attribute". 2018-07-06. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2270.pdf. 
  48. "WG14-N2267 : The nodiscard attribute". 2018-07-06. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2267.pdf. 
  49. "WG14-N2764 : The noreturn attribute". 2021-06-21. https://open-std.org/JTC1/SC22/WG14/www/docs/n2764.pdf. 
  50. "WG14-N2557 : Allow Duplicate Attributes". 2020-09-01. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2557.pdf. 
  51. "WG14-N2418 : Adding the u8 character prefix". 2019-09-02. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2418.pdf. 
  52. What is the point of the UTF-8 character literals proposed for C++17?; Stack Overflow.
  53. "WG14-N2341 : ISO/IEC TS 18661-2 - Floating-point extensions for C - Part 2: Decimal floating-point arithmetic". February 26, 2019. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2341.pdf. 
  54. "WG14-N2601 : Annex X - IEC 60559 interchange and extended types". October 15, 2020. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2601.pdf. 
  55. "WG14-N3018 : The constexpr specifier for object definitions". 2022-07-06. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3018.htm. 
  56. "WG14-N2653 : char8_t: A type for UTF-8 characters and strings (Revision 1)". 2021-06-04. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2653.htm. 
  57. "WG14-N2728 : char16_t & char32_t string literals shall be UTF-16 & UTF-32". 2021-05-15. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2728.htm. 
  58. "WG14-N3038 : Introduce storage-class specifiers for compound literals". 2022-07-21. https://open-std.org/JTC1/SC22/WG14/www/docs/n3038.htm. 
  59. "WG14-N2940 : Removing trigraphs??!". 2022-03-02. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2940.pdf. 
  60. "WG14-N2432 : Remove support for function definitions with identifier lists proposal". September 25, 2019. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2432.pdf. 
  61. "WG14-N2841 : No function declarators without prototypes". 2021-10-10. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2841.htm. 
  62. "WG14-N2412 : Two's complement sign representation". August 11, 2019. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2412.pdf. 
  63. "WG14-N2993 : Make *_HAS_SUBNORM be obsolescent". 2022-06-06. https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2993.htm. 
  64. "GCC 9 Release Notes". https://gcc.gnu.org/gcc-9/changes.html#c. 
  65. "Clang 9.0 - add new language mode for C2x". May 14, 2019. https://github.com/llvm/llvm-project/commit/d06f3917913d2558b771ccc48d838f8cd8993c01. 
  66. "Pelles C - major changes between 10.00 and 11.00". http://www.smorgasbordet.com/pellesc/changes_1000_1100.htm. 

External links

Preceded by
C17
C language standards Latest