I kodebasen, som danner grundlaget for den planlagte udgivelse af compileren GCC 15 til forĂ„r nĂŠste Ă„r, er der truffet en ĂŠndring, der inkluderer, at standarden C23 med GNU-udvidelser (â-std=gnu23â) bruges som standard ved kompilering af programmer skrevet i C (tidligere var standarden C17 â â-std=gnu17â). Ăndringen kan potentielt skabe problemer med eksisterende projekter, da der er forskelle i den nye standard, sĂ„som tilfĂžjelsen af konstanten nullptr, typen _BitInt(n) samt nĂžgleordene bool, true og false, der kan konflikte med identifikatorer med samme navn i applikationer.
Standard C23 (ISO/IEC 9899:2024) blev officielt offentliggjort af den internationale standardiseringsorganisation (ISO) den 31. oktober 2024. Blandt ĂŠndringerne i den nye standard er:
- Muligheden for at definere funktioner i K&R C-stil, der blev brugt fĂžr vedtagelsen af ANSI C-specifikationen og beskrevet i bogen âThe C Programming Languageâ af Kernighan og Ritchie, er blevet fjernet. K&R-stilen indebĂŠrer, at argumenttyperne beskrives efter funktionsdefinitionen, for eksempel âint add(a, b) int a, b; {}â.
- NavnlĂžse funktionsparametre â muligheden for ikke at angive navne pĂ„ ubrugte parametre ved definition af funktioner (som i C++). For eksempel kan man nu skrive âint f(int, int) { return 7; }â.
- UnderstĂžttelse af syntaksen â[[navn]]â til definition af attributter som i C++ (â[[gnu::const]]â, â[[deprecated]]â, â[[fallthrough]]â, â[[maybe_unused]]â, â[[nodiscard]]â, â[[noreturn]]â, â[[reproducible]]â, â[[unsequenced]]â). For eksempel tillader attributten [[noreturn]] at angive, at funktionen ikke returnerer vĂŠrdier (headerfilen stdnoreturn.h og specifikatoren â_Noreturnâ er erklĂŠret forĂŠldede).
- UnderstĂžttelse af syntaksen u8 til definition af konstanter med tegn i UTF-8.
- Introduceret typen char8_t til strenge og tegn med UTF-8-kodning, samt funktioner til konvertering af strenge med flermybte tegn mbrtoc8() og c8rtomb().
- Funktionen af nĂžgleordet âautoâ er ĂŠndret, sĂ„ det nu fĂžrer til typeafledning ved definition af objekter, hvilket gĂžr det muligt at bruge âautoâ i stedet for en type til at definere typene af variabler baseret pĂ„ udtrykstypen til deres initialisering. For eksempel: âauto y = cos(x);â.
- Funktioner med en tom parameterliste behandles nu som funktioner, der ikke tager argumenter.
- UnderstĂžttelse af header-filerne og er tilfĂžjet med makroer, funktioner og typer til kontrol af heltalsberegninger.
- Placering af switch-mĂŠrker er tilladt hvor som helst i sammensatte udtryk.
- UnderstĂžttelse af trigraf-kode er ophĂžrt. Trigrafer, som er sekvenser af tre ASCII-tegn, der behandles som et enkelt tegn, fx sekvensen "??=", kunne bruges i stedet for "#". Efter introduktionen af Unicode er trigraf-understĂžttelse blevet meningslĂžs.
- UnderstĂžttelse af prĂŠfikserne "0b" og "0B" til angivelse af heltal i binĂŠr form er tilfĂžjet, fx "int b = 0b101010".
- NĂžgleordene bool, static_assert, alignas, alignof og thread_local er tilfĂžjet.
- Angivelse af tomme parenteser "{}" til initialisering med nul-vĂŠrdier er tilladt, dvs. man kan nu skrive "struct S { int x, y } s = {};".
- Muligheden for at angive enhver universel tegnnavn i tegn- og strengliteraler er givet. For eksempel, "int \u0024 = 0;".
- Makroen "unreachable" er tilfĂžjet i "stddef.h".
- Den nye type nullptr_t og konstanten nullptr tilfĂžjes til definitionen af null-pegere, der kan konverteres til enhver pointer-type og reprĂŠsentere en NULL-variant, der ikke er knyttet til heltal- eller void*-typer. For eksempel kan man angive "void func(nullptr_t); func(0); func((void *)0);".
- Typerne "_BitInt (N)" og "unsigned _BitInt (N)" er tilfÞjet til at definere heltal med et angivet antal bits samt decimaltaltyperne "_Decimal32", "_Decimal64" og "_Decimal128" samt funktioner til arbejde med sÄdanne typer.
- Muligheden for at bruge tegnet "â" til tydelig adskillelse af positioner i tal er tilfĂžjet (fx "1â000â000").
- Strukturer, unioner og enum typer er tilladt at definere mere end én gang i et scope med indhold, der er det samme og med gentagne tags.
- OperatĂžrerne typeof og typeof_unqual er inkluderet i standarden.
- UnderstĂžttelse af brugen af constexpr-specifikatoren til at definere objekter er blevet tilfĂžjet.
- Makroerne INFINITY, NAN, FLT_NORM_MAX, DBL_NORM_MAX og LDBL_NORM_MAX er tilfĂžjet i header filerene float.h og math.h.
- PrĂŠprocessor-direktiverne #elifdef, #elifndef, #warning og #embed er tilfĂžjet. "#embed" er beregnet til integration af binĂŠre ressourcer.
- Brugen af variadic lister er blevet forenklet.
- Mulighederne for enumerations (enum) er blevet udvidet.
- TilfÞjet understÞttelse af pladsholderen «%b» til behandling af binÊre vÊrdier i printf() og scanf() funktionsfamilier.
- Kaldet til funktionen realloc() med en stÞrrelse pÄ nul er blevet klassificeret som ubestemt opfÞrsel.
- Funktionerne memccpy(), strdup(), strndup(), gmtime_r() og localtime_r() er blevet standardiseret.
- Funktionerne asctime() og ctime() er blevet erklĂŠret forĂŠldede.
- Makroerne static_assert og thread_local er blevet klassificeret som sĂžgeord.
Kilde: opennet.ru
