| C language revisions |
|---|
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 literal constant prefixes; 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.[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
The following compilers implement an experimental compiler flag to support C29:
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)”.
See also
References
- ^ Seacord, Robert. “C2Y Schedule” (PDF).
{{cite web}}: CS1 maint: url-status (link) - ^ a b c d e f g h “WG14 Document Repository”. open-std.org. Archived from the original on September 30, 2025.
- ^ a b “GCC 15 Release Series”. GNU.org. Archived from the original on October 27, 2025.
- ^ a b “LLVM Clang 19 Adds Initial “-std=c2y” Support For The Next C Standard”. Phoronix.com. July 2, 2024. Archived from the original on October 27, 2025.
- ^ a b “C Support in Clang – C2Y implementation status”. LLVM.org. Archived from the original on October 27, 2025.
- ^ a b c d e f g “WG14-N3685: Working Draft for ISO/IEC 9899:202Y” (PDF). open-std.org. September 28, 2025. Archived (PDF) from the original on October 31, 2025.
- ^ a b c d “WG14-N3353: Obsolete implicitly octal literals and add delimited escape sequences”. open-std.org. October 18, 2024. Archived from the original on October 3, 2025.
- ^ “WG14-N2630: Formatted input/output of binary integer numbers (rev3) (for C23)” (PDF). open-std.org. January 1, 2021. Archived (PDF) from the original on December 14, 2022.
- ^ “WG21-p2290r3: Delimited escape sequences (for C++23)” (PDF). open-std.org. February 25, 2022. Archived (PDF) from the original on October 11, 2025.
- ^ “WG14-N3369: New _Lengthof() operator (v4)” (PDF). open-std.org. October 1, 2021. Archived (PDF) from the original on August 31, 2025.
- ^ “WG14-N3469: The Big Array Size Survey”. open-std.org. February 3, 2025. Archived from the original on October 7, 2025.
- ^ “The Big Array Size Survey for C”. thephd.dev. November 6, 2024. Archived from the original on April 4, 2025.
- ^ cppreference.com. “std::size, std::ssize”. cppreference.com. cppreference.com. Retrieved 14 December 2025.
- ^ JeanHeyd Meneide (2025). “Programming – C – defer, a mechanism for general purpose, lexical scope-based undo” (PDF). open-std.org. WG 14.
- ^ LLVM Project (24 February 2026). “Clang 22.1.0 Release Notes”. releases.llvm.org. LLVM Project.
- ^ “WG14-N3356: ‘if’ declarations, v3”. open-std.org. September 18, 2024. Archived from the original on August 4, 2025.
- ^ “WG14-N3370: Case range expressions, v3.1”. open-std.org. October 1, 2024. Archived from the original on August 4, 2025.
- ^ “WG14-N3355: Named loops, v3”. open-std.org. September 18, 2024. Archived from the original on October 9, 2025.
- ^ “WG14-N3457: The __COUNTER__ predefined macro”. open-std.org. January 25, 2025. Archived from the original on September 19, 2025.
- ^ a b “WG14-N3326: Standardize strnlen and wcsnlen (v3)” (PDF). open-std.org. September 1, 2024. Archived (PDF) from the original on April 21, 2025.
- ^ a b c d e f “WG14-N3367: More Modern Bit Utilities”. open-std.org. September 4, 2024. Archived from the original on October 3, 2025.
- ^ “WG14-N3022: Modern Bit Utilities (for C23)”. open-std.org. July 6, 2022. Archived from the original on December 24, 2022.
- ^ “WG14-N3274: Remove imaginary types” (PDF). open-std.org. June 14, 2024. Archived (PDF) from the original on August 24, 2025.
Further reading
- N3854 (latest working draft with C29 changes); WG14; March 2026. (free download)
- N3220 (first working draft after C23; differs from final C23 draft N3219 only in one footnote); WG14; February 2024. (free download)
External links
- WG14 Document Repository
- WG14 Meetings – agenda and minutes