Top Qs
Timeline
Chat
Perspective

C2Y (C standard revision)

C programming language standard draft, next revision From Wikipedia, the free encyclopedia

Remove ads

C2Y is an informal name for the next revision of the C programming language after C23 that is hoped to be released in the 2020s, hence the '2' in "C2Y". An early working draft of C2Y was released in February 2024 as N3220.[1] The first "Working Group 14" (WG14) meeting primarily about the C2Y draft was held in February 2025.[2] Changes have already started to be integrated in popular C/C++ compilers: GCC 15 and Clang 19.[3][4][5]

Remove ads

Features

Summarize
Perspective

The following are changes integrated into the latest working draft of C2Y.[6][1] Keep in mind that 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 literal constant prefixes; such as 0o137 and 0O247.[7] This change is similar to 0b and 0B binary literal constant prefixes that were previously added in the C23 standard.[8]
  • 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{} is a valid syntax in Rust and JavaScript computer languages too.

Operators

  • Add _Countof keyword & operator, and countof() macro in <stdcountof.h> to determine the number of elements of an array, such as long baudrate[22]; ns = countof(baudrate); means ns is 22.[10][11]

Statements

  • For the if statement, add support for variable declaration, such as if (int err = xmit_ch(ch)) 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 all branches of if, else, else if too. 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.[12]

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]

New functions

  • 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.[13] More bit utility functions were previously added in the C23 standard.[14]
    • 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, ...[13]
    • 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.[13]
    • 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.[13]
    • 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, ...[13]
    • 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, ...[13]
Remove ads

Obsolete features

Obsolete C programming language features removed or deprecated in the working draft of C2Y:[6][1]

Constants

  • For octal literals, such as 057, the leading zero will be retained but marked as obsolescent 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.[15]
Remove ads

Compiler support

The following compilers implement an experimental compiler flag to support C2Y:

History

Summarize
Perspective

January 2024

The following changes were made after the January 2024 WG14 meeting:[6][1]

  • 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][1]

  • 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][1]

  • 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][1]

  • 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".
Remove ads

See also

References

Further reading

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads