I kodbasen som ligger till grund för den planerade lanseringen av kompilatoruppsĂ€ttningen GCC 15 vĂ„ren nĂ€sta Ă„r har en Ă€ndring införts som innebĂ€r att standarden C23 med GNU-tillĂ€gg ('-std=gnu23') kommer att anvĂ€ndas som standard nĂ€r program skrivs i C (tidigare anvĂ€ndes standarden C17 - '-std=gnu17'). Ăndringen kan potentiellt leda till problem vid kompilering av befintliga projekt, eftersom den nya standarden har skillnader, sĂ„som tillĂ€gget av konstanten nullptr, typen _BitInt(n) och nyckelorden bool, true och false, vilka kan krocka med identifierare med samma namn som anvĂ€nds i programmen.
Standarden C23 (ISO/IEC 9899:2024) publicerades officiellt av den internationella standardiseringsorganisationen (ISO) den 31 oktober 2024. Bland förÀndringarna i den nya standarden:
- Möjligheten att definiera funktioner i K&R C-stil, som anvÀndes före antagandet av ANSI C-specifikationen och som beskrivs i boken 'The C Programming Language' av Kernighan och Ritchie, har tagits bort. K&R-stilen innebÀr att typbeskrivningar av argument görs efter funktionsdefinitionen, till exempel 'int add(a, b) int a, b; {}'
- ObenÀmnda funktionsparametrar - valfrihet att ange namn för oönskade parametrar vid funktionsdefinition (som i C++). Till exempel kan man nu skriva 'int f(int, int) { return 7; }'.
- Stöd för syntaxen '[[namn]]' för att definiera attribut som i C++ ('[[gnu::const]]', '[[deprecated]]', '[[fallthrough]]', '[[maybe_unused]]', '[[nodiscard]]', '[[noreturn]]', '[[reproducible]]', '[[unsequenced]]'). Till exempel gör attributet [[noreturn]] det möjligt att ange att en funktion inte returnerar vÀrden (header-filen stdnoreturn.h och specifikatorn '_Noreturn' har förklarats förÄldrade).
- Stöd för syntaxen u8' för att definiera konstanter med tecken i UTF-8.
- Typen char8_t har lagts till för strÀngar och tecken i UTF-8-kodning samt funktioner för konvertering av strÀngar med flerbyte-tecken mbrtoc8() och c8rtomb().
- Beteendet för nyckelordet 'auto' har Àndrats, vilket nu leder till typutdragning vid objektdefinition, vilket möjliggör anvÀndning av nyckelordet 'auto' istÀllet för typ för att bestÀmma typ av variabler baserat pÄ uttryckstypen för deras initialisering. Till exempel: 'auto y = cos(x);'.
- Funktioner med en tom parameterlista hanteras nu som funktioner som inte tar nÄgra argument.
- Stöd för headerfilerna och med makron, funktioner och typer för kontroll av heltalsberÀkningar har lagts till.
- Det Àr nu tillÄtet att placera brytpunkter pÄ valfria stÀllen inom sammansatta uttryck.
- Stödet för trigraf-tecken i koden har upphört. Trigraf-tecken, som Àr sekvenser av tre ASCII-tecken som behandlas som ett tecken, till exempel sekvensen "??=", kunde anvÀndas istÀllet för "#". Med Unicode framtrÀder trigrafers stöd som meningslöst.
- Stöd för prefixen "0b" och "0B" har lagts till för att ange heltal i binÀr form, till exempel "int b = 0b101010".
- Nyckelorden bool, static_assert, alignas, alignof och thread_local har lagts till.
- Tomma klamrar "{}" Àr nu tillÄtna för att initialisera till nollvÀrden, det vill sÀga nu kan man skriva "struct S { int x, y } s = {};".
- Det har blivit möjligt att ange valfria universella symbolnamn i tecken- och strÀnglitraler. Till exempel, "int \u0024 = 0;".
- Makrot "unreachable" har lagts till i "stddef.h".
- En ny typ nullptr_t och konstanten nullptr för att definiera nullpekare som kan konverteras till vilken pekartyp som helst och representera varianten NULL, som inte Àr kopplad till heltal eller typen void*. Till exempel, kan man ange "void func(nullptr_t); func(0); func((void *)0);".
- Typerna "_BitInt (N)" och "unsigned _BitInt (N))" har lagts till för att definiera heltal med ett angivet antal bitar, liksom decimala flyttalstyper "_Decimal32", "_Decimal64" och "_Decimal128" och funktioner för att arbeta med sÄdana typer.
- Möjligheten att anvĂ€nda tecknet "â" för tydlig separation av siffror i tal (till exempel "1â000â000") har lagts till.
- Strukturer, unioner och upprÀkningar kan nu definieras mer Àn en gÄng i samma synlighet med samma innehÄll och upprepande tagg.
- Operatörerna typeof och typeof_unqual har lagts till i standarden.
- Stöd för att anvÀnda specifikatorn constexpr för att definiera objekt har introducerats.
- Makron INFINITY, NAN, FLT_NORM_MAX, DBL_NORM_MAX och LDBL_NORM_MAX har lagts till i headerfilerna float.h och math.h.
- Förbearbetningsdirektiven #elifdef, #elifndef, #warning och #embed har lagts till. "#embed" Àr avsett för integration av binÀra resurser.
- AnvÀndningen av listor med ett variabelt antal argument (variadic) har förenklats.
- Funktionerna hos upprÀkningar (enum) har utökats.
- Stöd för substitut "%b" har lagts till för hantering av binÀra vÀrden i printf() och scanf() funktionsfamiljer.
- Anropet till funktionen realloc() med nollstorlek har övergÄtt till att vara osÀker beteende.
- Funktionerna memccpy(), strdup(), strndup(), gmtime_r() och localtime_r() har standardiserats.
- Funktionerna asctime() och ctime() har förklarats som förÄldrade.
- Makron static_assert och thread_local har övergÄtt till nyckelord.
KĂ€lla: opennet.ru
