C2Y (C standard revision)
C programming language standard draft planned for release in 2029
From Wikipedia, the free encyclopedia
C29 is the upcoming revision of the C programming language after C23 that is planned for release in late 2029,[1] informally named C2Y. Early working drafts of C29 were released after the January 2024 WG14 meeting. The current working draft N3854 was released in March 2026.[2] Changes have already started to be integrated in popular C/C++ compilers: GCC 15 and Clang 19.[3][4][5]
Features
The following are changes integrated into the latest working draft of C29.[6][2] The following changes are still is the draft stage, thus anything may change before the final ratification.
Note: This section is not complete. Changes listed in the History section will be incrementally migrated into this section over time.
Constants
- Add
0oand0Ooctal prefix for literal constants; such as0o137and0O247.[7] This change is similar to the0band0Bbinary prefixes that were previously added in the C23 & C++14 standards,[8] and earlier established0xand0Xhexadecimal prefixes. - Add
{}delimited escape sequences for C strings:\o{}for octal (arbitrary number of octal digits),\x{}for hexadecimal (arbitrary number of hex digits),\u{}for universal character name (sequence of hex digits that represents a valid Unicode character); such as"\o{110}\x{65}llo"which creates a string identical to "Hello" (in ASCII), and"\u{2021}"which is the Unicode value of a double dagger "‡" character, creating that character.[7] This change was previously added in the C++23 standard.[9] The\u{}format is an established syntax in Rust and JavaScript computer languages too.
Operators
- Add
_Countofkeyword & operator, andcountof()macro in the new<stdcountof.h>header of the C standard library to determine the number of elements of an array, such aslong baudrate[22]; size_t n = countof(baudrate);meansnis 22.[10][11][12] This is already possible in C++ using thestd::size()function.[13]
Statements
- Add the
deferkeyword and defer blocks and statements.[14] This is similar to Go or Zig which both usedeferfor cleanup. Compilers like GCC and Clang have implemented this specification.[15] - For the
ifstatement, add support for variable declaration, such asif (int err = xmit_ch('X')) log_err(err);, similar to how theforchange was added in the C99 standard. The new variable can be used inside the scope of all branches ofif,else,else iftoo. In C++, variable declaration has been allowed since the C++98 standard, further enhanced in the C++17 standard to allow for a second clause so the variable could be used within the condition itself, and C will use the later for C++ compatibility.[16] - For the
switchstatement, add support forcaseranges by placing...(ellipsis) between two integer constants, such ascase 1 ... 3:which would be equivalent tocase 1: case 2: case 3:.[17] The space between the numbers and the ellipsis is mandatory. - For statements that are iterations and for the
switchstatement, add naming via labels and transferring control through namedbreakandcontinue(multi-level breaks). The syntax is the same as in Java.[18]
Preprocessor
- Add
__COUNTER__macro. Each time used, the preprocessor expands it into a unique sequential integer literal, starting from 0 and increments by 1 every time it is expanded. Though already in use by many compilers, this change makes it an official standarized macro for C.[19]
Standard Library
Existing functions
- For functions
strtol(),strtoll(),strtoul(),strtoull(), and their wide counterpartswcstol(),wcstoll(),wcstoul(),wcstoull(), if the value of base is 8 (octal), the characters0oor0Omay optionally precede the sequence of digits. If a sign is present, the0oor0Ofollows the sign.[7] - For functions
strnlen_s()andwcsnlen_s(), their description was updated to be worded similar to the newstrnlen()andwcsnlen()functions (below).[20]
New functions
- Add
strnlen()andwcsnlen()functions, similar tostrlen()but instead a specified maximum number of characters will be searched for the end of string character. Both functions have been part of the GNU C library since at least 2001 and later became part of the POSIX.1-2008 standard.[20] - Add bit utility functions / macros / types in header
<stdbit.h>to examine many integer types. All start withstdc_to minimize conflict with legacy code and 3rd party libraries.[21] More bit utility functions were previously added in the C23 standard.[22]- Add
stdc_memreverse8()(8-bit) andstdc_memreverse8uN()(exact-width 8-bit) to reverse memory, such as0xAABBCCDDureversed into0xDDCCBBAAu. For function name suffix: "u" means unsigned, "N" means a multiple of 8, such as 8, 16, 32, ...[21] - Add
stdc_rotate_left_uc(),stdc_rotate_left_us(),stdc_rotate_left_ui(),stdc_rotate_left_ul(),stdc_rotate_left_ull(), and genericstdc_rotate_left()to rotate bits left.[21] - Add
stdc_rotate_right_uc(),stdc_rotate_right_us(),stdc_rotate_right_ui(),stdc_rotate_right_ul(),stdc_rotate_right_ull(), and genericstdc_rotate_right()to rotate bits right.[21] - Add
stdc_load8_leuN(),stdc_load8_beuN(),stdc_load8_aligned_leuN(),stdc_load8_aligned_beuN(), andstdc_load8_lesN(),stdc_load8_besN(),stdc_load8_aligned_lesN(),stdc_load8_aligned_besN()to perform endian-aware 8-bit loads. For function name suffix: "b" means big endian, "l" means little endian, "u" means unsigned, "s" means signed, "N" means a multiple of 8 such as 8, 16, 32, ...[21] - Add
stdc_store8_leuN(),stdc_store8_beuN(),stdc_store8_aligned_leuN(),stdc_store8_aligned_beuN(), andstdc_store8_lesN(),stdc_store8_besN(),stdc_store8_aligned_lesN(),stdc_store8_aligned_besN()to perform endian-aware 8-bit stores. For function name suffix: "b" means big endian, "l" means little endian, "u" means unsigned, "s" means signed, "N" means a multiple of 8 such as 8, 16, 32, ...[21]
- Add
Obsolete features
Obsolete C programming language features removed or deprecated in the working draft of C29:[6][2]
Constants
- For octal literals, such as
057, the leading zero will be marked as obsolescent but retained to avoid breaking existing code. Compilers should output a warning that will hopefully encourage rewrites. As of N3353, there will be no changes toprintf(), but WG14 would like to see a future paper that propose changes.[7]
Keywords
- Remove
_Imaginaryfrom the list of keywords.[23]
Compiler support
History
The highlighted changes in this section have been summarized in the feature sections above.
January 2024
The following changes were made after the January 2024 WG14 meeting:[6][2]
- N3192 - "Sequential hexdigits".
- Editorial - Adjusted a footnote in Annex K from "reserved" to "potentially reserved".
June 2024
The following changes were made after the June 2024 WG14 meeting:[6][2]
- N3064 - "Writing to multibyte character files".
- N3232 - "Round-trip rounding".
- N3233 - "Recommendation for printf rounding".
- N3239 - "Some constants are literally literals, v2".
- N3242 - "Problematic use of "correctly rounded".
- N3244 - "Slay Some Earthly Demons I".
- N3247 - "fopen "p" and bring fopen’s mode closer to POSIX 202x".
- N3254 - "Accessing byte arrays, v4".
- N3259 - "Support ++ and -- on complex values".
- N3260 - "_Generic selection expression with a type operand".
- N3273 - "alignof of an incomplete array type".
- N3274 - "Remove imaginary types, v3".
- Editorial - "may" -> "can" for alignment with ISO/IEC directives.
- Editorial - Table headings changed to match ISO/IEC directives.
September 2024
The following changes were made after the September/October 2024 WG14 meeting:[6][2]
- N3272 - "strftime broken-down structure usage (Option 1 - "Undefined Behavior)".
- N3286 - "Floating-point exception for Macro Replacements".
- N3287 - "Nonsensical Parenthetical in Mathematics Specification".
- N3291 - "Decimal Floating-Point Number Term Misuse".
- N3298 - "Introduce Complex Literals".
- N3303 - "HUGE_VAL Corrections".
- N3305 - "Leftover WANT_... Macros for <math.h> and Decimal Floating-Point".
- N3312 - "Relax Atomic Alignment Requirements".
- N3322 - "Allow Zero Length operations on Null Pointers (Including in the Library)".
- N3323 - "How Do You Add One To Something? (By Using The Proper Type)".
- N3324 - "'pole-error' Wording Fix".
- N3326 - "Standardize strnlen and wcsnlen".
- N3340 - "Slay Some Earthly Demons II".
- N3341 - "Slay Some Earthly Demons III".
- N3342 - "Slay Some Earthly Demons IV".
- N3344 - "Slay Some Earthly Demons VI".
- N3345 - "Slay Some Earthly Demons VII".
- N3346 - "Slay Some Earthly Demons VIII".
- N3349 - "abs Without Undefined Behavior".
- N3353 - "Obsolete Octal and Provide New, Proper Escape Sequences".
- N3355 - "Named/Labeled Loops".
- N3356 - "if Declarations".
- N3364 - "SNAN Initialization".
- N3366 - "Restartable Functions for Efficient Character Conversions".
- N3367 - "More Modern Bit Utilities".
- N3369 - "The _Lengthof Operator".
- N3370 - "Case Ranges in switch Statements".
- N3461 - "range error definition followup".
February 2025
The following changes were made after the February 2025 WG14 meeting:[6][2]
- N3363 - "<stdarg.h> Wording".
- N3401 - "SIGFPE and I/O (v2)".
- N3405 - "Improved Wording for Treatment of Error Conditions in <math.h>".
- N3409 - "Slay Some Earthly Demons X".
- N3410 - "Slay Some Earthly Demons XI".
- N3411 - "Slay Some Earthly Demons XII".
- N3418 - "Slay Some Earthly Demons XIV".
- N3447 - "Chasing Ghost I - "Constant Expressions".
- N3448 - "Chasing Ghosts II - "Accessing Allocated Storage".
- N3451 - "Initialization of Anonymous Structures and Unions (v2)".
- N3452 - "Complex Literals Warning".
- N3459 - "Integer and Arithmetic Constant Expressions".
- N3460 - "Complex Operators".
- N3466 - "Clarifications on Null Pointers in the Library".
- N3469 - "Big Array Size Survey (_Lengthof -> _Countof, and <stdcountof.h> header)".
- N3478 - "Slay Some Earthly Demons XIII".
- N3481 - "Slay Some Earthly Demons XVI".
- N3482 - "Slay Some Earthly Demons XVII".
- N3492 - "Improved treatment of error conditions for functions that round result".
- N3496 - "Clarify the Specification of the Width Macros".
- N3505 - "Preprocessor integer expressions, II".
August 2025
The following changes were made after the August 2025 WG14 meeting:[6][2]
- N3348 - "Matching of Multi-Dimensional Arrays in Generic Selection Expressions".
- N3457 - "The __COUNTER__ predefined macro".
- N3484 - "Slay Some Earthly Demons V".
- N3500 - "Clarification for Complex Suffix Specification".
- N3511 - "Remove "category" from "type category" in footnote".
- N3517 - "Array subscripting without decay".
- N3525 - "static_assert without UB".
- N3532 - "Member Access of an Incomplete struct Should Not Be Allowed".
- N3535 - "frexp and double-double".
- N3536 - "Clarify wording of cproj".
- N3537 - "Correct and clarify 7.3.1 Introduction of Complex Arithmetic <complex.h>".
- N3544 - "Classification of the register Storage-class Specifier".
- N3558 - "Chasing Ghosts I - "Constant Expressions and Objects of Known Constant Size".
- N3563 - "Representation of Pointers and nullptr_t".
- N3577 - "Rename uimaxabs to umaxabs".
- N3598 - "Make text consistent between creal and cimag".
- N3623 - "Slay Some Earthly Demons XIV - "Definition of Main".
- N3652 - "Composite types v1.3".
February 2026
The following changes were integrated at or before the 2026 February Virtual meeting:
- N3715 - "static_assert expressions, v2.2 (November 2025 integration from between-meeting strawpolls, approved August 2025)".