C23 (C standard revision)

Last updated

C23, formally ISO/IEC 9899:2024, is the current open standard for the C programming language, which supersedes C17 (standard ISO/IEC 9899:2018). [1] It was started in 2016 informally as C2x, [2] and was published on October 31, 2024. [3] The freely available draft most similar to the one published is document N3220 [4] (see Available texts, below). 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.

Contents

In C23, the value of __STDC_VERSION__ changes from 201710L to 202311L. The common names "C17" and "C23" reflect these values, which are frozen prior to final adoption, rather than the years in the ISO standards identifiers (9899:2018 and 9899:2024).

Features

Changes integrated into the latest working draft of C23 are listed below. [6]

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. [7]
  • Add memccpy() function in <string.h> to efficiently concatenate strings – similar to POSIX and SVID C extensions. [8]
  • Add strdup() and strndup() functions in <string.h> to allocate a copy of a string – similar to POSIX and SVID C extensions. [9]
  • Add memalignment() function in <stdlib.h> to determine the byte alignment of a pointer. [10]
  • 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. [11]
    • In the following, replace * with uc, us, ui, ul, ull for five function names, or blank for a type-generic macro. [11]
    • Add stdc_count_ones*() and stdc_count_zeros*() to count number of 1 or 0 bits in value. [11]
    • Add stdc_leading_ones*() and stdc_leading_zeros*() to count leading 1 or 0 bits in value. [11]
    • Add stdc_trailing_ones*() and stdc_trailing_zeros*() to count trailing 1 or 0 bits in value. [11]
    • Add stdc_first_leading_one*() and stdc_first_leading_zero*() to find first leading bit with 1 or 0 in value. [11]
    • Add stdc_first_trailing_one*() and stdc_first_trailing_zero*() to find first trailing bit with 1 or 0 in value. [11]
    • 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). [11]
    • Add stdc_bit_floor*() to determine the largest integral power of 2 that is not greater than value. [11]
    • Add stdc_bit_ceil*() to determine the smallest integral power of 2 that is not less than value. [11]
    • Add stdc_bit_width*() to determine number of bits to represent a value. [11]
  • Add timegm() function in <time.h> to convert time structure into calendar time value - similar to function in glibc and musl libraries. [12]
  • New <math.h> functions based on IEEE 754-2019 recommendations, such as trigonometry functions operating on units of and exp10. [13]

Existing functions

Preprocessor

Types

Constants

Keywords

Syntax

C++ compatibility

Other features

Obsolete features

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

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

Compiler support

The following compilers implement an experimental compiler flag to support this standard:

Additionally, versions of GCC beyond GCC 15 now use C23 by default. [71]

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, [6] dated 2023-04-01. In the months that followed this draft, hundreds of changes [72] were made before producing the working draft N3149 dated 2023-07-09 and the official draft standard N3219 dated 2024-02-22. [72] [73] Neither of these later drafts are public. [72] [73]

On the same date that the draft standard N3219 was announced, a new working draft N3220 [4] was made public. While this document is officially described [73] 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. [73]

See also

References

  1. "History of C". cppreference.com. 2022-06-27. Archived from the original on October 19, 2022.
  2. "WG14-N2086: C2x Charter". open-std.org. 2016-09-20. Archived from the original on December 22, 2022.
  3. "ISO/IEC PRF 9899". iso.org. Archived from the original on September 19, 2024.
  4. 1 2 "ISO/IEC 9899:2024 (en) — N3220 working draft" (PDF). open-std.org. 2024-02-22.
  5. "WG14-N2437: Agenda for October 2019". open-std.org. 2019-10-21. Archived from the original on March 5, 2021.
  6. 1 2 "WG14-N3096: Draft for ISO/IEC 9899:2024" (PDF). open-std.org. April 1, 2023. Archived (PDF) from the original on April 2, 2023.
  7. "WG14-N2897: memset_explicit()". open-std.org. 2021-12-27. Archived from the original on October 25, 2022.
  8. "WG14-N2349: Toward more efficient string copying and concatenation". open-std.org. 2019-03-18. Archived from the original on September 30, 2022.
  9. "WG14-N2353: strdup() and strndup()". open-std.org. 2019-03-18. Archived from the original on December 24, 2022.
  10. "WG14-N2974: Queryable pointer alignment" (PDF). open-std.org. 2022-04-15. Archived (PDF) from the original on October 13, 2022.
  11. 1 2 3 4 5 6 7 8 9 10 11 "WG14-N3022: Modern Bit Utilities". open-std.org. 2022-07-06. Archived from the original on December 24, 2022.
  12. "WG14-N2833: Add timegm() as non-optional part of time.h". open-std.org. 2021-10-07. Archived from the original on December 1, 2021.
  13. See N3096 § B.11 for a useful overview. The functions were added in separate documents: N2488, its updated versions, and its refs.
  14. 1 2 3 "WG14-N2630: formatted input/output of binary integer numbers" (PDF). open-std.org. 2021-01-01. Archived (PDF) from the original on December 14, 2022.
  15. "WG14-N3020: Qualifier-preserving standard library functions" (PDF). open-std.org. 2022-06-13. Archived (PDF) from the original on October 13, 2022.
  16. 1 2 "WG14-N2645: Add support for preprocessing directives #elifdef and #elifndef" (PDF). open-std.org. 2020-01-25. Archived (PDF) from the original on November 28, 2022.
  17. "GCC 12 Adds Support For New #elifdef #elifndef Directives". phoronix. May 12, 2021. Archived from the original on December 27, 2022.
  18. "WG14-N3017: #embed - a scannable, tooling-friendly binary resource inclusion mechanism". open-std.org. 2022-06-27. Archived from the original on December 24, 2022.
  19. "WG14-N2686: #warning" (PDF). open-std.org. 2022-07-22. Archived (PDF) from the original on November 28, 2022.
  20. "WG14-N2799: __has_include for C" (PDF). open-std.org. 2021-08-30. Archived (PDF) from the original on December 24, 2022.
  21. "WG14-N2553: Querying attribute support" (PDF). open-std.org. 2020-08-04. Archived (PDF) from the original on October 14, 2022.
  22. "WG14-N3033: Comma omission and comma deletion". open-std.org. 2022-07-20. Archived from the original on December 27, 2022.
  23. 1 2 "WR14-N3042: Introduce the nullptr constant". open-std.org. 2022-07-22. Archived from the original on December 24, 2022.
  24. "WG14-N2763: Adding a Fundamental Type for N-bit integers" (PDF). open-std.org. 2021-06-21. Archived (PDF) from the original on December 27, 2022.
  25. "WG14-N3035: _BitInt Fixes" (PDF). open-std.org. 2022-07-21. Archived (PDF) from the original on October 13, 2022.
  26. "WG14-N2867: Checked N-Bit Integers" (PDF). open-std.org. 2021-11-28. Archived (PDF) from the original on December 14, 2022.
  27. "WG14-N2778: Variably-Modified Types" (PDF). open-std.org. 2021-07-11. Archived (PDF) from the original on December 22, 2022.
  28. "WG14-N2607: Compatibility of Pointers to Arrays with Qualifiers" (PDF). open-std.org. 2020-10-31. Archived (PDF) from the original on October 13, 2022.
  29. "WG14-N2899: Not-so-magic - typeof for C". open-std.org. 2022-01-21. Archived from the original on December 24, 2022.
  30. "WG14-N3007: Type inference for object definitions". open-std.org. 2022-06-10. Archived from the original on December 24, 2022.
  31. "WG14-N3037: Improved Rules for Tag Compatibility (updates N3032)" (PDF).
  32. "C23 is Finished: Here is What is on the Menu". The Pasture. 31 July 2022.
  33. "WG14-N2775: Literal suffixes for bit-precise integers" (PDF). open-std.org. 2021-07-13. Archived (PDF) from the original on December 27, 2022.
  34. "WG14-N2549: Allow for binary integer constants" (PDF). open-std.org. 2020-07-30. Archived (PDF) from the original on December 22, 2022.
  35. "WG14-N2626: Digit separators" (PDF). open-std.org. 2020-12-15. Archived (PDF) from the original on December 19, 2022.
  36. "WG14-N3030: Enhancements to Enumerations". open-std.org. 2022-07-19. Archived from the original on November 26, 2022.
  37. "WG14-N3029: Improved Normal Enumerations". open-std.org. 2022-07-19. Archived from the original on January 29, 2023.
  38. "WG14-N2935: Make false and true first-class language features" (PDF). open-std.org. 2022-02-15. Archived (PDF) from the original on November 21, 2022.
  39. "WG14-N2934: Revise spelling of keywords" (PDF). open-std.org. 2022-02-15. Archived (PDF) from the original on December 24, 2022.
  40. "WG14-N2508: Free Positioning of Labels Inside Compound Statements" (PDF). open-std.org. 2020-03-28. Archived (PDF) from the original on December 27, 2022.
  41. "WG14-N2510: Allowing unnamed parameters in a function definition" (PDF). open-std.org. 2020-04-09. Archived (PDF) from the original on December 24, 2022.
  42. "WG14-N2900: Consistent, Warningless, and Intuitive Initialization with {}". open-std.org. 2022-01-01. Archived from the original on December 27, 2022.
  43. "WG14-N2975: Relax requirements for variadic parameter lists" (PDF). open-std.org. 2022-04-15. Archived (PDF) from the original on November 28, 2022.
  44. "WG14-N2335: Attributes in C" (PDF). open-std.org. 2019-03-09. Archived (PDF) from the original on October 26, 2022.
  45. 1 2 "Unsequenced functions". open-std.org. Retrieved 2024-07-18.
  46. "WG14-N2265: Harmonizing static_assert with C++" (PDF). open-std.org. 2018-07-06. Archived (PDF) from the original on March 28, 2023.
  47. "Labels at the end of compound statements (C compatibility)" (PDF). 2022-01-13.
  48. "WG14-N2554: Minor attribute wording cleanups" (PDF). open-std.org. 2020-08-04. Archived (PDF) from the original on November 28, 2022.
  49. "WG14-N2334: The deprecated attribute" (PDF). open-std.org. 2019-01-22. Archived (PDF) from the original on October 19, 2022.
  50. "WG14-N2408: The fallthrough attribute" (PDF). open-std.org. 2019-08-11. Archived (PDF) from the original on December 25, 2022.
  51. "WG14-N2270: The maybe_unused attribute" (PDF). open-std.org. 2018-07-06. Archived (PDF) from the original on December 25, 2022.
  52. "WG14-N2267: The nodiscard attribute" (PDF). open-std.org. 2018-07-06. Archived (PDF) from the original on October 19, 2022.
  53. "WG14-N2764: The noreturn attribute" (PDF). open-std.org. 2021-06-21. Archived (PDF) from the original on December 25, 2022.
  54. "WG14-N2557: Allow Duplicate Attributes" (PDF). open-std.org. 2020-09-01. Archived (PDF) from the original on November 28, 2022.
  55. "WG14-N2418: Adding the u8 character prefix" (PDF). open-std.org. 2019-09-02. Archived (PDF) from the original on January 13, 2023.
  56. What is the point of the UTF-8 character literals proposed for C++17?; Stack Overflow.
  57. "WG14-N2341: ISO/IEC TS 18661-2 - Floating-point extensions for C - Part 2: Decimal floating-point arithmetic" (PDF). open-std.org. February 26, 2019. Archived (PDF) from the original on November 21, 2022.
  58. "WG14-N2601: Annex X - IEC 60559 interchange and extended types" (PDF). open-std.org. October 15, 2020. Archived (PDF) from the original on October 14, 2022.
  59. "WG14-N3018: The constexpr specifier for object definitions". open-std.org. 2022-07-06. Archived from the original on December 24, 2022.
  60. "WG14-N2653: char8_t: A type for UTF-8 characters and strings (Revision 1)". open-std.org. 2021-06-04. Archived from the original on May 27, 2023.
  61. "WG14-N2728: char16_t & char32_t string literals shall be UTF-16 & UTF-32". open-std.org. 2021-05-15. Archived from the original on May 27, 2023.
  62. "WG14-N3038: Introduce storage-class specifiers for compound literals". open-std.org. 2022-07-21. Archived from the original on November 26, 2022.
  63. "WG14-N2940: Removing trigraphs??!" (PDF). open-std.org. 2022-03-02. Archived (PDF) from the original on October 26, 2022.
  64. "WG14-N2432: Remove support for function definitions with identifier lists proposal" (PDF). open-std.org. September 25, 2019. Archived (PDF) from the original on December 27, 2022.
  65. "WG14-N2841: No function declarators without prototypes". open-std.org. 2021-10-10. Archived from the original on November 12, 2022.
  66. "WG14-N2412: Two's complement sign representation" (PDF). open-std.org. August 11, 2019. Archived (PDF) from the original on December 27, 2022.
  67. "WG14-N2993: Make *_HAS_SUBNORM be obsolescent". open-std.org. 2022-06-06. Archived from the original on December 5, 2022.
  68. "GCC 9 Release Notes". GNU Project. Archived from the original on December 27, 2022.
  69. "Clang 9.0 - add new language mode for C2x". LLVM Project Repository. May 14, 2019. Archived from the original on December 27, 2022.
  70. "Pelles C - major changes between 10.00 and 11.00". smorgasbordet.com. Archived from the original on December 27, 2022.
  71. "GCC 15 Release Series". GNU Project. Retrieved 13 July 2025.
  72. 1 2 3 "N3150 - Editor's Report, Post January-February 2023 Meeting". open-std.org. 2023-07-08.
  73. 1 2 3 4 "N3221 - Editor's Report, Post January 2024 Meeting". open-std.org. 2024-02-15.

Further reading

Preceded by
C17
C language standards Latest