NĂ« kodin burimor, mbi tĂ« cilin Ă«shtĂ« formuar versioni i planifikuar pĂ«r pranverĂ«n e vitit tĂ« ardhshĂ«m tĂ« paketĂ«s sĂ« kompilatorĂ«ve GCC 15, Ă«shtĂ« pranuar njĂ« ndryshim qĂ« pĂ«rfshin pĂ«rdorimin si standart tĂ« paracaktuar tĂ« standardit C23 me zgjerimet GNU ('-std=gnu23') gjatĂ« kompilimit tĂ« programeve nĂ« gjuhĂ«n C (mĂ« parĂ« si standart tĂ« paracaktuar Ă«shtĂ« pĂ«rdorur standardi C17 â '-std=gnu17'). Ndryshimi potencialisht mund tĂ« çojĂ« nĂ« probleme gjatĂ« ndĂ«rtimit tĂ« projekteve ekzistuese, pasi standardi i ri ka dallime, tĂ« tilla si shtimi i konstantĂ«s nullptr, llojit _BitInt(n) dhe fjalĂ«ve kyçe bool, true dhe false, tĂ« cilat mund tĂ« bien nĂ« konflikt me identifikuesit e emĂ«ruar nĂ« aplikacione.
Standardi 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:
- ĂshtĂ« hequr mundĂ«sia e pĂ«rcaktimit tĂ« funksioneve nĂ« stilin K&R C, i pĂ«rdorur pĂ«rpara miratimit tĂ« specifikacionit ANSI C dhe i pĂ«rshkruar nĂ« librin 'The C Programming Language' tĂ« Kernighan dhe Ritchie. Stili K&R nĂ«nkupton pĂ«rshkrimin e tipeve tĂ« argumenteve pas pĂ«rcaktimit tĂ« funksionit, pĂ«r shembull, 'int add(a, b) int a, b; {}'
- Parametrat e paemëruara të funksioneve - mosprania e emrave të parametrave të palidhur në definimin e funksioneve (si në C++). Për shembull, tani mund të shkruani «int f(int, int) { return 7; }».
- Mbështetje për sintaksën «[[emri]]» për të përcaktuar atribute 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 (file header stdnoreturn.h dhe specifikatori «_Noreturn» janë shpallur të vjetëruara).
- Mbështetje për sintaksën u8» për të përcaktuar konstantet me simbole në UTF-8.
- Shtuar tipi char8_t për vargje dhe simbole në kodimin UTF-8, si dhe funksione për konvertimin e vargjeve me simbole me shumë byte mbrtoc8() dhe c8rtomb().
- Veprimi i fjalës kyçe «auto» është ndryshuar, tani e cila çon në njoftimin e tipit kur definohen objektet, çka lejon përdorimin e atributit «auto» në vend të tipit për përcaktimin e tipave të variablave të bazuar në tipin e shprehjes për inicializimin e tyre. Për shembull: «auto y = cos(x);».
- Funksionet me listë argumetesh bosh tani trajtohen si funksione që nuk marrin argumente.
- Shtimi i mbështetjes për skedarët e titullit dhe me makros, funksione dhe tipe për verifikimin e llogaritjeve të numrave të plotë.
- Lejohet vendosja e etiketave të kalimit në çdo vend brenda shprehjeve të përbatura.
- Përkrahja e tri-grafëve në kod është ndaluar, sekuencave të tre simboleve ASCII, të trajtuara si një simbol i vetëm; për shembull, sekuenca «??=» mund të përdorej në vend të «#». Me paraqitjen e Unicode, mbështetjes për tri-grafët ka humbur kuptim.
- Shtimi i mbështetjes për prefikset «0b» dhe «0B» për tregimin e vlerave të plotë në formë binare, për shembull, «int b = 0b101010».
- Shtohen fjalët kyçe bool, static_assert, alignas, alignof dhe thread_local.
- Lejohet specifikimi i kllozave të zbrazëta «{}» për inicializimin në vlera zero, dmth tani mund të shkruhet «struct S { int x, y } s = {};».
- Të ofrohet mundësia për të specifikuar çfarëdo emrave universale të simboleve në literalët simbole dhe string. Për shembull, «int \u0024 = 0;».
- Në «stddef.h» është shtuar makros «unreachable».
- Shto u shtua një lloj nullptr_t dhe konstantën nullptr për përcaktimin e treguesve të nul, të cilat mund të konvertohen në çdo lloj treguesi dhe të paraqesin variantin NULL, pa u lidhur me llojet numerike dhe llojin void*. Për shembull, mund të specifikohet «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ë specifikuar bitesh, si dhe llojet dekadale me pikë të lëvizshme «_Decimal32», «_Decimal64» dhe «_Decimal128» dhe funksionet për të punuar me lloje të tillë.
- Shtuar mundĂ«sia e pĂ«rdorimit tĂ« simbolit «â» pĂ«r ndarjen e qartĂ« tĂ« shifrave nĂ« numra (pĂ«r shembull, «1â000â000»).
- E lejuar të përcaktohen struktura, bashkime dhe enumerime më shumë se një herë në një hapësirë të njëjtë me të njëjtin përmbajtje dhe etiketë përsëritëse.
- Në standard janë përfshirë operatorët typeof dhe typeof_unqual.
- Ka 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 makro INFINITY, NAN, FLT_NORM_MAX, DBL_NORM_MAX dhe LDBL_NORM_MAX.
- Shtuar direktivat e përpunimit të parakohshëm #elifdef, #elifndef, #warning dhe #embed. «#embed» është e destinuar për integrimin e burimeve binarë.
- E lehtësuar përdorimi i listave me numër variabël argumentesh (variadic).
- Zgjeruar mundësitë e enumerimeve (enum).
- Shtuar mbështetje për zëvendësimin "%b" për trajtimin e vlerave binare në familjet e funksioneve printf() dhe scanf().
- Thirrja e funksionit realloc() me madhësi zero është klasifikuar si sjellje e pacaktuar.
- Standardizuar funksionet memccpy(), strdup(), strndup(), gmtime_r() dhe localtime_r().
- Klasifikuar si të vjetruara funksionet asctime() dhe ctime().
- Maksimat e static_assert dhe thread_local janë kaluar në radhën e fjalëve kyç.
Burimi: opennet.ru
