Wikiwand AI

C29 (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 N3886 was released in May 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 0o and 0O octal prefix for literal constants; such as 0o137 and 0O247.[7] This change is similar to the 0b and 0B binary prefixes that were previously added in the C23 & C++14 standards,[8] and earlier established 0x and 0X hexadecimal 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.

Operators

  • Add _Countof keyword & operator, and countof macro in the new <stdcountof.h> header of the C standard library to determine the number of elements of an array, such as long baudrate[22]; size_t n = countof(baudrate); means n is 22.[10][11][12] This is already possible in C++ using the std::size() function.[13]
  • For the array subscript operator, add the ability to subscript register arrays without undefined/implementation defined behavior. If a is an array and i has integer type a[i] is redefined to mean the i+1-th element of the array instead of *(a + i), avoiding the array-to-pointer conversion which is undefined for register arrays in C23 and is implementation-defined after N3244. In addition, if i is a constant expression, then it is not allowed to be negative, which removes one possible cause of undefined behavior.[14]

Statements

  • Add the defer keyword and defer blocks and statements.[15] This is similar to Go or Zig which both use defer for cleanup. Compilers like GCC and Clang have implemented this specification.[16]
  • For the if statement, add support for variable declaration, such as if (int err = xmit_ch('X')) log_err(err);, similar to how the for change was added in the C99 standard. The new variable can be used inside the scope of both the if and the else branch. 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 latter for C++ compatibility.[17]
  • For the switch statement, add support for case ranges by placing ... (ellipsis) between two integer constants, such as case 1 ... 3: which would be equivalent to case 1: case 2: case 3:.[18] The space between the numbers and the ellipsis is mandatory.
  • For statements that are iterations and for the switch statement, add naming via labels and transferring control through named break and continue (multi-level breaks). The syntax is the same as in Java.[19]

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 standardized macro for C.[20]

Standard Library

Existing functions

  • For functions strtol(), strtoll(), strtoul(), strtoull(), and their wide counterparts wcstol(), wcstoll(), wcstoul(), wcstoull(), if the value of base is 8 (octal), the characters 0o or 0O may optionally precede the sequence of digits. If a sign is present, the 0o or 0O follows the sign.[7]
  • For functions strnlen_s() and wcsnlen_s(), their description was updated to be worded similar to the new strnlen() and wcsnlen() functions (below).[21]

New functions

  • Add strnlen() and wcsnlen() functions, similar to strlen() 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.[21]
  • Add bit utility functions / macros / types in header <stdbit.h> to examine many integer types. All start with stdc_ to minimize conflict with legacy code and 3rd party libraries.[22] More bit utility functions were previously added in the C23 standard.[23]
    • Add stdc_memreverse8() (8-bit) and stdc_memreverse8uN() (exact-width 8-bit) to reverse memory, such as 0xAABBCCDDu reversed into 0xDDCCBBAAu. For function name suffix: "u" means unsigned, "N" means a multiple of 8, such as 8, 16, 32, ...[22]
    • Add stdc_rotate_left_uc(), stdc_rotate_left_us(), stdc_rotate_left_ui(), stdc_rotate_left_ul(), stdc_rotate_left_ull(), and generic stdc_rotate_left() to rotate bits left.[22]
    • Add stdc_rotate_right_uc(), stdc_rotate_right_us(), stdc_rotate_right_ui(), stdc_rotate_right_ul(), stdc_rotate_right_ull(), and generic stdc_rotate_right() to rotate bits right.[22]
    • Add stdc_load8_leuN(), stdc_load8_beuN(), stdc_load8_aligned_leuN(), stdc_load8_aligned_beuN(), and stdc_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, ...[22]
    • Add stdc_store8_leuN(), stdc_store8_beuN(), stdc_store8_aligned_leuN(), stdc_store8_aligned_beuN(), and stdc_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, ...[22]
  • Add text transcoding utilities under the header <stdmchar.h>.[24]

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 to printf(), but WG14 would like to see a future paper that propose changes.[7]

Keywords

  • Remove _Imaginary from the list of keywords.[25]

Operators

  • For the array subscripting operator, the form i[a], where i has integer type is marked obsolescent but remains supported.[14]

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

Further reading

Related Articles

Timelines

Top Qs

Fact Checks