In de codebasis waarop de geplande release van de GCC 15-compiler set volgend voorjaar is gebaseerd, is een wijziging doorgevoerd die standaard gebruik van de C23-standaard met GNU-uitbreidingen ('-std=gnu23') bij het compileren van C-programma's omvat (voorheen werd de C17-standaard ('-std=gnu17') standaard gebruikt). Deze wijziging kan potentieel problemen veroorzaken bij het bouwen van bestaande projecten, aangezien de nieuwe standaard verschillen bevat, zoals de toevoeging van de constante nullptr, het type _BitInt(n) en de sleutelwoorden bool, true en false, die kunnen conflicteren met identificeerders met dezelfde naam die in applicaties zijn opgegeven.
De C23-standaard (ISO/IEC 9899:2024) werd officieel gepubliceerd door de internationale organisatie voor standaardisatie (ISO) op 31 oktober 2024. Enkele wijzigingen in de nieuwe standaard zijn:
- De mogelijkheid om functies in K&R C-stijl te definiƫren, die voor de goedkeuring van de ANSI C-specificatie werd gebruikt en beschreven in het boek 'The C Programming Language' van Kernighan en Ritchie, is verwijderd. De K&R-stijl houdt in dat de typen argumenten na de functiedefinitie worden beschreven, bijvoorbeeld 'int add(a, b) int a, b; {}'
- Onbenoembare functieparameters ā de verplichting om namen op te geven voor ongebruikte parameters bij het definiĆ«ren van functies (zoals in C++), is opgeheven. Bijvoorbeeld, nu is het mogelijk om te schrijven 'int f(int, int) { return 7; }'.
- Ondersteuning voor de syntaxis '[[naam]]' voor het definiƫren van attributen zoals in C++ ('[[gnu::const]]', '[[deprecated]]', '[[fallthrough]]', '[[maybe_unused]]', '[[nodiscard]]', '[[noreturn]]', '[[reproducible]]', '[[unsequenced]]'). Bijvoorbeeld, het attribuut [[noreturn]] geeft aan dat een functie geen waarden retourneert (de header stdnoreturn.h en de specificator '_Noreturn' zijn verouderd verklaard).
- Ondersteuning voor de syntaxis u8' voor het definiƫren van constanten met tekens in UTF-8.
- Een nieuw type char8_t is toegevoegd voor strings en tekens in UTF-8-codering, evenals functies voor het converteren van strings met meerbytesymbolen mbrtoc8() en c8rtomb().
- De werking van het sleutelwoord 'auto' is gewijzigd, waardoor het nu leidt tot type-afleiding bij het definiƫren van objecten, wat het mogelijk maakt om de 'auto'-indicatie in plaats van het type te gebruiken voor het definiƫren van de typevariabelen op basis van het type van de expressie voor hun initialisatie. Bijvoorbeeld: 'auto y = cos(x);'.
- Functies met een lege argumentenlijst worden nu behandeld als functies die geen argumenten aannemen.
- Ondersteuning toegevoegd voor headerbestanden en met macro's, functies en types voor het controleren van gehele getallen berekeningen.
- Overal binnen samengestelde expressies zijn overgangslabels toegestaan.
- Ondersteuning voor trigraphs in de code is beƫindigd, sequenties van drie ASCII-tekens die als ƩƩn teken worden verwerkt, bijvoorbeeld de sequentie "??=" die gebruikt kon worden in plaats van "#". Na de invoering van Unicode is de ondersteuning voor trigraphs zinloos geworden.
- Ondersteuning toegevoegd voor de prefixen "0b" en "0B" om gehele waarden in binaire vorm aan te geven, bijvoorbeeld "int b = 0b101010".
- Toegevoegd de sleutelwoorden bool, static_assert, alignas, alignof en thread_local.
- Het is toegestaan om lege accolades "{}" te gebruiken voor initialisatie met nulwaarden, dat wil zeggen, nu kan men schrijven "struct S { int x, y } s = {};".
- Het is mogelijk om elke universele tekennaam op te geven in teken- en stringliteralen. Bijvoorbeeld, "int \u0024 = 0;".
- De macro "unreachable" is toegevoegd aan "stddef.h".
- Een nieuw type nullptr_t en constante nullptr toegevoegd voor het definiƫren van nulverwijzers, die naar elk pointertype kunnen worden geconverteerd en een variant van NULL vertegenwoordigen, niet gebonden aan gehele typen en type void*. Bijvoorbeeld, men kan schrijven "void func(nullptr_t); func(0); func((void *)0);".
- De types "_BitInt (N)" en "unsigned _BitInt (N)" zijn toegevoegd voor het definiƫren van gehele getallen met een opgegeven aantal bits, evenals de decimale types met drijvende komma "_Decimal32", "_Decimal64" en "_Decimal128" en functies voor het werken met dergelijke types.
- Het gebruik van het teken "ā" voor het visueel scheiden van cijfers in getallen is toegevoegd (bijvoorbeeld "1ā000ā000").
- Structuren, unies en enumeraties mogen meer dan eens in dezelfde scope worden gedefinieerd met dezelfde inhoud en herhalende tag.
- De operators typeof en typeof_unqual zijn aan de standaard toegevoegd.
- Ondersteuning voor het gebruik van de specifier constexpr voor het definiëren van objecten is geïntroduceerd.
- Macro's INFINITY, NAN, FLT_NORM_MAX, DBL_NORM_MAX en LDBL_NORM_MAX zijn toegevoegd aan de headerbestanden float.h en math.h.
- Preprocessor-directieven #elifdef, #elifndef, #warning en #embed zijn toegevoegd. "#embed" is bedoeld voor de integratie van binaire bronnen.
- Het gebruik van lijsten met een variabel aantal argumenten (variadic) is vereenvoudigd.
- De mogelijkheden van enumeraties (enum) zijn uitgebreid.
- Ondersteuning voor de placeholder Ā«%bĀ» is toegevoegd voor het verwerken van binaire waarden in de printf() en scanf() functiefamilies.
- Een aanroep van de functie realloc() met een nulgrootte is omgevormd tot onbepaald gedrag.
- De functies memccpy(), strdup(), strndup(), gmtime_r() en localtime_r() zijn gestandaardiseerd.
- De functies asctime() en ctime() zijn als verouderd verklaard.
- De macro's static_assert en thread_local zijn opgenomen in de categorie sleutelwoorden.
Bron: opennet.ru
