سی2x

**C2x** نام غیررسمی ویرایش بعدی استاندارد زبان C (پس از C17) است. انتظار می‌رود در سال ۲۰۲۳ این نسخه از استاندارد، به‌طور کامل منتشر شود.

## سربرگ‌های جدید
* `<stdbit.h>`
* `<stdckdint.h>`

## ویژگی‌های جدید زبان
تغییرات ادغام‌شده در آخرین پیش‌نویس عبارتند از:
* پشتیبانی از ISO/IEC 60559:2020، نسخه فعلی استاندارد IEEE 754 برای محاسبات ممیز شناور، با محاسبات ممیز شناور باینری توسعه‌یافته و محاسبات ممیز شناور اعشاری (اختیاری)
* _Static_Assert تک‌آرگومانی
* اتریبیوت‌هایی (ویژگی) همانند C++11 و اتریبیوت‌های `nodiscard` ، `maybe_unused` ، `deprecated` و `fallthrough` و `noreturn` و `reproducible` و `unsequenced`
* `memccpy`, `strdup`, `strndup` – مشابه توابع موجود در اکستنشن‌های POSIX و SVID C
* نمایش عدد صحیح امضاشدهٔ مکمل دو الزامی شده است
* لیبل‌ها می‌توانند قبل از اعلان‌ها و در انتهای عبارات ترکیبی ظاهر شوند
* پارامترهای بی‌نام در تعاریف تابع
* ثابت‌های دودویی مانند `0b10101010` و مشخص‌کننده تبدیل `%b` برای خانواده `printf`
* پشتیبانی بهتر برای استفاده از const با آرایه‌ها
* نوع توابع عمومی برای انجام محاسبات اعداد صحیح بررسی‌شده (سرریز عدد صحیح)
* `_BitInt(N)` و `unsigned _BitInt(N)` برای اعداد صحیح bit-precise
* `#elifdef` و `#elifndef`
* جداکننده ارقام: `0xFF'FF'FF'FF`
* استانداردسازی `typeof(...)` (typof)
* انواع Variably-modified (اما نه VLAها که متغیرهای خودکار تخصیص داده شده در پشته هستند) به یک ویژگی اجباری تبدیل می‌شوند.
* مقداردهی اولیه با `{}` (شامل مقداردهی اولیه VLAها)
* `alignas`, `alignof`, `bool`, `true`, `false`, `static_assert`, `thread_local` به کلمات کلیدی تبدیل می‌شوند
* `true` و `false` به کلمات کلیدی تبدیل می‌شوند (ممکن است به دلایل سازگاری، ماکروهای از پیش‌تعریف‌شده شوند)
* `memset_explicit` برای پاک‌کردن داده‌های حساس
* `#embed` برای گنجاندن منابع باینری
* `#warning`
* ثابت `nullptr` و نوع `nullptr_t` مرتبط
* پراگما جهت گرد کردن: STDC FENV_ROUND و STDC FENV_DEC_ROUND

## ویژگی‌های جدید کتابخانه
* توابع ریاضی ممیز شناور باینری توسعه‌یافته
* توابع ریاضی ممیز شناور اعشاری
* انواع -`d`*N* برای توابع ریاضی ممیز شناور موجود و جدید
** `quantizedN`
** `samequantumdN`
** `quantumdN`
** `llquantexpdN`
** `encodedecdN`
** `decodedecdN`
** `encodebindN`
** `decodebindN`
* توابع قالب بندی ممیز شناور
* پشتیبانی کتابخانه از UTF-8
** آلیاس `char8_t`
** `mbrtoc8`
** `c8rtomb`
** آلیاس `atomic_char8_t`
** ماکرو آزمایشی `ATOMIC_CHAR8_T_LOCK_FREE`
* توابع POSIX
** `memccpy`
** `strdup`
** `strndup`
** `gmtime_r`
** `localtime_r`
** اکستنشن‌هایی برای `strftime` و `wcsftime`
* اکستنشن‌هایی برای خانواده‌های تابع `fscanf` و `fprintf`.
** اصلاح‌کننده طول w*N* و wf*N* به ترتیب برای `[u]intN_t` و `[u]int_fastN_t`
** اصلاح‌کننده‌های طول H, D و DD به ترتیب برای `_Decimal32`، `_Decimal64` و `_Decimal128`
** مشخص‌کننده تبدیل b برای انواع عدد صحیح بدون علامت
* `timespec_getres`
* ثابت‌های ماکرو برای عرض انواع اعداد صحیح
* ماکروهای محدود عددی اضافی برای انواع ممیز شناور
* ماکروهای تستِ نسخه:
** `__STDC_VERSION_FENV_H__`
** `__STDC_VERSION_MATH_H__`
** `__STDC_VERSION_STDINT_H__`
** `__STDC_VERSION_STDLIB_H__`
** `__STDC_VERSION_TGMATH_H__`
** `__STDC_VERSION_TIME_H__`
** `__STDC_VERSION_STDCKDINT_H__`
** `__STDC_VERSION_STDBIT_H__`

## پشتیبانی
کامپایلرهای GCC 9، Clang 9.0، و Pelles C 11.00 فلگ (پرچم) کامپایلر آزمایشی را برای پشتیبانی از این استاندارد پیاده‌سازی می‌کنند.

## ویژگی‌های منسوخ‌شده
برخی از ویژگی‌های قدیمی، یا حذف‌شده یا منسوخ شده‌اند.

### حذف‌شده
* حذف تعاریف تابع به شیوه K&R
* نمایش اعداد صحیح امضا شده به غیر از مکمل دو
* اجازه دادن به ثابت‌های کاراکتر با پیشوند u/U و لیترال‌های رشته‌ای که ممکن است UTF-16/32 نباشند
* سلسله لیترال‌های رشته گسترده مخلوط‌شده
* پشتیبانی از فراخوانی `realloc` با اندازه صفر (با رفتار تعریف‌نشده (UB) مواجه می‌شوید)
*`__alignof_is_defined` و `__alignas_is_defined`
*`static_assert` دیگر به عنوان یک ماکرو در `<assert.h>` ارائه نمی‌شود (به یک کلمه‌کلیدی تبدیل می‌شود)
*`thread_local` دیگر به عنوان یک ماکرو در `
! reads.h | ` ارائه نمی‌شود (به یک کلمه‌کلیدی تبدیل می‌شود)

### منسوخ‌شده
* `<stdnoreturn.h>`
* ماکروهای تست ویژگی قدیمی
** `__STDC_IEC_559__`
** `__STDC_IEC_559_COMPLEX__`
* _مشخص کننده تابع `Noreturn_`
* توکن اتریبیوت `Noreturn_`
* `asctime`
* `ctime`
* `DECIMAL_DIG`
* تعریف ماکروهای لیمیت عددی زیر در `<math.h>` (باید با `<limits.h>` استفاده شوند)
** `INFINITY`
** `DEC_INFINITY`
** `NAN`
** `DEC_NAN`
* `__bool_true_false_are_defined`

## منابع


## پیوند به بیرون
* اسناد گروه کاری C WG14
* N3054، پیش‌نویس استاندارد (سپتامبر ۲۰۲۲)

رده:زبان برنامه‌نویسی سی
رده:زبان‌های برنامه‌نویسی خانواده سی
رده:استانداردهای زبان برنامه‌نویسی