Në bazën e kodit, mbi të cilën është formuluar versioni i planifikuar për pranverën e vitit të ardhshëm të paketës së kompajlerëve GCC 15, është miratuar një ndryshim, i cili përfshin përdorimin standard të C23 me zgjerimet GNU («-std=gnu23») për kompilimin e programeve në gjuhën C (më parë, standardi C17 ishte përdorur si standard i parazgjedhur - «-std=gnu17»). Ky ndryshim mund të sjellë probleme gjatë ndërtimit të projekteve ekzistuese, pasi në standardin e ri ka dallime, si shtimi i konstantës nullptr, tipit _BitInt(n) dhe fjalëve kyçe bool, true dhe false, të cilat mund të bien në konflikt me identifikuesit e njëjtë të caktuar në aplikacione.
Standarti C23 (ISO/IEC 9899:2024) u publikua zyrtarisht nga organizata ndërkombëtare për standardizim (ISO) më 31 tetor 2024. Ndër ndryshimet në standardin e ri janë:
- Është hequr mundësia e përcaktimit të funksioneve në stilin K&R C, i përdorur para miratimit të specifikimit ANSI C dhe i përshkruar në librin «The C Programming Language» të Kernighan dhe Ritchie. Stili K&R përfshin përshkrimin e tipeve të argumenteve pas përcaktimit të funksionit, për shembull, «int add(a, b) int a, b; {}»
- Parametrat e paemërtuar të funksioneve - nuk është e detyrueshme të specifikohen emrat e parametrave të pashfrytëzuar gjatë përcaktimit të funksioneve (si në C++). Për shembull, tani mund të shkruajmë «int f(int, int) { return 7; }».
- Përshtatja e sintaksës «[[emri]]» për përcaktimin e atributeve si në C++ («[[gnu::const]]», «[[deprecated]]», «[[fallthrough]]», «[[maybe_unused]]», «[[nodiscard]]», «[[noreturn]]», «[[reproducible]]», «[[unsequenced]]»). Për shembull, atributi [[noreturn]] lejon të specifikohet se funksioni nuk kthen vlera (skedari i titullit stdnoreturn.h dhe specifikuesi «_Noreturn» janë shpallur të vjetëruar).
- Mbështetje për sintaksën u8» për përcaktimin e konstantave me simbole në UTF-8.
- Shtuar tipi char8_t për stringje dhe simbole në kodimin UTF-8, si dhe funksionet për konvertimin e stringjeve me simbole multi-byte mbrtoc8() dhe c8rtomb().
- Modifikuar veprimi i fjalës kyçe «auto», e cila tani çon në nxjerrjen e tipit gjatë përcaktimit të objekteve, duke lejuar përdorimin e shenjës «auto» në vend të tipit për përcaktimin e tipit të variablave në bazë të tipit të shprehjes për inicializimin e tyre. Për shembull: «auto y = cos(x);».
- Funksionet me një listë të zbrazët argumentesh tani trajtohen si funksione që nuk pranojnë argumente.
- Shtesa e mbështetjes për skedarët e titujve dhe me makros, funksione dhe lloje për verifikimin e llogaritjeve të numrave të plotë.
- Lejohet vendosja e etiketave të kalimit në çdo vend brenda shprehjeve të përbëra.
- Mbështetje për tri-grafët është ndaluar në kod, sekuenca nga tre simbole ASCII të trajtuara si një simbol, për shembull, sekuenca «??=» mund të përdoret në vend të «#». Pas shfaqjes së Unicode, mbështetje për tri-grafët ka humbur kuptimin.
- Shtesa e mbështetjes për prefiksin «0b» dhe «0B» për tregimin e vlerave të plota në formën binare, për shembull, «int b = 0b101010».
- Shtuar fjalë kyçe bool, static_assert, alignas, alignof dhe thread_local.
- Lejohet spesifikimi i kllapa të zbrazëta «{}» për inicializim në vlera të zeros, dmth tani mund të shkruhet «struct S { int x, y } s = {};».
- Ofruar mundësia për të specificuar çfarëdo emra universale simbolesh në letërsi karakteresh dhe vargjet. Për shembull, «int \u0024 = 0;».
- Në «stddef.h» është shtuar makroja «unreachable».
- Shtuar një tip të ri nullptr_t dhe konstantën nullptr për përcaktimin e treguesve të zeros, të cilët mund të konvertohen në çdo tip tregues dhe të përfaqësojnë variantin NULL, të papër lidhur me tipat e plotë dhe tipin void*. Për shembull, mund të specikohet «void func(nullptr_t); func(0); func((void *)0);».
- Shtuar llojet «_BitInt (N)» dhe «unsigned _BitInt (N)» për përcaktimin e numrave të plotë me një numër të caktuar bitësh, si dhe llojet në notën dhjetore me pikë të lëvizshme «_Decimal32», «_Decimal64» dhe «_Decimal128» dhe funksionet për të punuar me këto lloje.
- Shtuar mundësia e përdorimit të simbolit «‘» për të ndarë vizualisht numrat në shifra (për shembull, «1’000’000»).
- Strukturat, bashkësitë dhe enumerimet lejohet të përcaktohen më shumë se një herë në një fushë të caktuar me të njëjtin përmbajtje dhe etiketë përsëritëse.
- Në standard u përfshinë operatorët typeof dhe typeof_unqual.
- Ka filluar mbështetje për përdorimin e specifikuesit constexpr për përcaktimin e objekteve.
- Në skedarët e titujve float.h dhe math.h janë shtuar makros INFINITY, NAN, FLT_NORM_MAX, DBL_NORM_MAX dhe LDBL_NORM_MAX.
- Shtuar direktivat e preprocessorit #elifdef, #elifndef, #warning dhe #embed. «#embed» është e destinuar për integrimin e burimeve binare.
- Përmirësuar përdorimin e listave me numër të variuar argumentesh (variadic).
- Zgjeruar mundësitë e enumerimeve (enum).
- është shtuar mbështetje për ndërrimin «%b» për përpunimin e vlerave binare në familjet e funksioneve printf() dhe scanf().
- Thirrja e funksionit realloc() me madhësi zero është klasifikuar si sjellje e paqartë.
- Funksionet memccpy(), strdup(), strndup(), gmtime_r() dhe localtime_r() janë standardizuar.
- Funksionet asctime() dhe ctime() janë shpallur të vjetra.
- Makrostatic_assert dhe thread_local janë klasifikuar si fjalë kyçe.
Burimi: opennet.ru
