În baza de cod pe care se va baza versiunea planificată pentru primăvara anului viitor a setului de compilatoare GCC 15, s-a adoptat o modificare care include utilizarea standardului C23 cu extensii GNU („-std=gnu23”) ca setare implicită pentru compilarea programelor în limbajul C (anterior, standardul utilizat implicit era C17 — „-std=gnu17”). Această modificare ar putea provoca probleme la compilarea proiectelor existente, deoarece noul standard conține diferențe, cum ar fi adăugarea constantei nullptr, a tipului _BitInt(n) și a cuvintelor cheie bool, true și false, care ar putea intra în conflict cu identificatorii omonimi definiți în aplicații.
Standardul C23 (ISO/IEC 9899:2024) a fost publicat oficial de organizația internațională de standardizare (ISO) pe 31 octombrie 2024. Printre modificările din noul standard se numără:
- Posibilitatea de a defini funcții în stil K&R C, utilizată înainte de adoptarea specificației ANSI C și descrisă în cartea „The C Programming Language” de Kernighan și Ritchie, a fost eliminată. Stilul K&R presupune descrierea tipurilor argumentelor după definirea funcției, de exemplu, „int add(a, b) int a, b; {}”.
- Parametrii neidentificați ai funcțiilor — opțiunea de a nu specifica numele parametrilor neutilizați la definirea funcțiilor (ca în C++). De exemplu, acum se poate scrie „int f(int, int) { return 7; }”.
- Suport pentru sintaxa „[[nume]]” pentru definirea atributelor precum în C++ („[[gnu::const]]”, „[[deprecated]]”, „[[fallthrough]]”, „[[maybe_unused]]”, „[[nodiscard]]”, „[[noreturn]]”, „[[reproducible]]”, „[[unsequenced]]”). De exemplu, atributul [[noreturn]] permite specificarea că funcția nu returnează valori (fișierul de antet stdnoreturn.h și specificatorul „_Noreturn” sunt considerate învechite).
- Suport pentru sintaxa u8” pentru definirea constantelor cu caractere în UTF-8.
- A fost adăugat tipul char8_t pentru șiruri și caractere în codificarea UTF-8, precum și funcții pentru conversia șirurilor cu caractere multibite mbrtoc8() și c8rtomb().
- Comportamentul cuvântului cheie „auto” a fost modificat, ceea ce duce acum la deducerea tipului la definirea obiectelor, permițând utilizarea indicatorului „auto” în locul tipului pentru a determina tipul variabilelor pe baza tipului expresiei pentru inițializarea acestora. De exemplu: „auto y = cos(x);”.
- Funcțiile cu o listă goală de argumente sunt acum tratate ca funcții care nu primesc argumente.
- A fost adăugat suport pentru fișierele de antet <stdckdint.h> și <stdbit.h> cu macrocomenzi, funcții și tipuri pentru verificarea calculului întregilor.
- A fost permisă plasarea etichetelor de salt în orice loc din expresii compuse.
- Suportul pentru trigrafuri a fost oprit în cod, secvențe de trei caractere ASCII, care erau tratate ca un singur caracter, de exemplu, secvența „??=” putea fi folosită în locul „#”. După apariția Unicode, suportul pentru trigrafuri a devenit inutil.
- A fost adăugat suport pentru prefixele „0b” și „0B” pentru a indica valori întregi în formă binară, de exemplu, „int b = 0b101010”.
- Au fost adăugate cuvintele cheie bool, static_assert, alignas, alignof și thread_local.
- A fost permisă specificarea acoladelor goale „{}” pentru inițializarea la valori nule, adică acum se poate scrie „struct S { int x, y } s = {};”.
- A fost oferită posibilitatea specificării oricăror nume universale de simboluri în literalel de caractere și stringuri. De exemplu, „int \u0024 = 0;”.
- În „stddef.h” a fost adăugat macro-ul „unreachable”.
- A fost adăugat un nou tip nullptr_t și constanta nullptr pentru a defini pointeri nuli, care pot fi convertiți în orice tip de pointeri și pot reprezenta varianta NULL, nelegată de tipuri întregi și de tipul void*. De exemplu, se poate specifica „void func(nullptr_t); func(0); func((void *)0);”.
- Au fost adăugate tipurile „_BitInt (N)” și „unsigned _BitInt (N)” pentru a defini numere întregi cu un număr specificat de biți, precum și tipuri zecimale cu virgulă flotantă „_Decimal32”, „_Decimal64” și „_Decimal128” și funcții pentru a lucra cu astfel de tipuri.
- A fost adăugată posibilitatea utilizării simbolului „‘” pentru a separa clar cifrele în numere (de exemplu, „1’000’000”).
- Structurile, uniunile și enumerările au fost permise să fie definite de mai multe ori într-un singur domeniu de vizibilitate cu același conținut și etichete repetitive.
- În standard au fost incluse operatorii typeof și typeof_unqual.
- A apărut suportul pentru utilizarea specificatorului constexpr pentru a defini obiecte.
- În fișierele de antet float.h și math.h au fost adăugate macrocomenzile INFINITY, NAN, FLT_NORM_MAX, DBL_NORM_MAX și LDBL_NORM_MAX.
- Au fost adăugate directivele preprocesorului #elifdef, #elifndef, #warning și #embed. „#embed” este destinat integrării resurselor binare.
- Utilizarea listelor cu un număr variabil de argumente (variadic) a fost simplificată.
- Funcționalitățile enumerărilor (enum) au fost extinse.
- A fost adăugată suport pentru substituția „%b” pentru procesarea valorilor binare în familiile de funcții printf() și scanf().
- Apelul funcției realloc() cu o dimensiune nulă a fost clasificat ca comportament nedefinit.
- Funcțiile memccpy(), strdup(), strndup(), gmtime_r() și localtime_r() au fost standardizate.
- Funcțiile asctime() și ctime() au fost declarate ca fiind învechite.
- Macrocomenzile static_assert și thread_local au fost incluse în categoria cuvintelor cheie.
Sursa: opennet.ro
