Kodebasen som brukes til å bygge GCC 15-kompilatorpakken som er planlagt utgitt neste vår, er endret til å bruke C23-standarden med GNU-utvidelser ("-std=gnu23") som standard ved kompilering av C-programmer (tidligere ble C17-standarden brukt som standard - "-std=gnu17"). Endringen kan potensielt forårsake problemer når man bygger eksisterende prosjekter, ettersom den nye standarden inkluderer forskjeller som tillegg av nullptr-konstanten, typen _BitInt(n) og nøkkelordene bool, true og false, som kan komme i konflikt med identifikatorer med samme navn definert i applikasjoner.
Standard C23 (ISO/IEC 9899:2024) ble offisielt publisert av International Organization for Standardization (ISO) 31. oktober 2024. Blant endringene i den nye standarden:
- Fjernet muligheten til å definere funksjoner i pre-ANSI C-stilen til K&R C, beskrevet i Kernighan og Ritchies The C Programming Language. K&R-stilen er å deklarere argumenttypene etter funksjonsdefinisjonen, for eksempel "int add(a, b) int a, b; {}»
- Funksjonsparametere uten navn - ingen grunn til å spesifisere navn på ubrukte parametere når du definerer funksjoner (som i C++). For eksempel kan du nå skrive "int f(int, int) { return 7; }».
- Støtte for "[[navn]]"-syntaks for å definere attributter som i C++ ("[[gnu::const]]", "[[avviklet]]", "[[fallthrough]]", "[[kanskje_ubrukt]]", "[[nodiscard]]", "[[noreturn]]", "[[reproduserbar]]]", "[[reproduserbar[]]]", "[[reproduserbar]]]]. For eksempel lar [[noreturn]]-attributtet deg spesifisere at en funksjon ikke returnerer noen verdier (stdnoreturn.h-overskriftsfilen og "_Noreturn"-spesifikasjonen er utdatert).
- Støtte for "u8"-syntaks for å definere konstanter med UTF-8-tegn.
- Lagt til char8_t-type for UTF-8-kodede strenger og tegn, samt funksjoner for å konvertere strenger med multibyte-tegn mbrtoc8() og c8rtomb().
- Effekten av nøkkelordet "auto" er endret for å forårsake typeslutning ved definering av objekter, slik at "auto"-flagget kan brukes i stedet for en type for å utlede typen variabler basert på typen uttrykk som brukes til å initialisere dem. For eksempel: "auto y = cos(x);".
- Funksjoner med en tom argumentliste behandles nå som funksjoner som ikke tar noen argumenter.
- Lagt til støtte for header-filer Og med makroer, funksjoner og typer for kontroll av heltallsberegninger.
- Det er tillatt å plassere overgangsetiketter hvor som helst innenfor sammensatte uttrykk.
- Koden støtter ikke lenger trigrafer, sekvenser med tre ASCII-tegn som behandles som et enkelt tegn, for eksempel kan sekvensen "??=" brukes i stedet for "#". Etter bruken av Unicode ble støtte for trigrafer meningsløs.
- Lagt til støtte for prefiksene "0b" og "0B" for å spesifisere heltallsverdier i binær form, for eksempel "int b = 0b101010".
- Lagt til søkeord bool, static_assert, alignas, alignof og thread_local.
- Tomme parenteser "{}" tillates brukt for initialisering til nullverdier, dvs. nå kan du skrive "struct S { int x, y } s = {};".
- Muligheten til å spesifisere alle universelle symbolnavn i bokstaver og strenger er gitt. For eksempel "int \u0024 = 0;".
- Makroen "unreachable" er lagt til "stddef.h".
- Lagt til en ny nullptr_t-type og nullptr-konstant for å definere null-pekere som kan konverteres til en hvilken som helst pekertype og representerer en variant av NULL som ikke er knyttet til heltallstyper eller void*. For eksempel kan du spesifisere "void func(nullptr_t); func(0); func((void *)0);».
- Lagt til "_BitInt(N)" og "unsigned _BitInt(N))"-typer for å definere heltall med et spesifisert antall biter, samt desimalflytepunkttyper "_Decimal32", "_Decimal64" og "_Decimal128" og funksjoner for å jobbe med slike typer.
- Lagt til muligheten til å bruke "'"-symbolet for å visuelt skille sifre i tall (for eksempel "1'000'000").
- Strukturer, fagforeninger og oppregninger kan defineres mer enn én gang i samme omfang med samme innhold og en gjentatt kode.
- Standarden inkluderer type og type_unqual-operatorer,
- Støtte er lagt til for bruk av constexpr-spesifikasjonen for å definere objekter.
- Makroene INFINITY, NAN, FLT_NORM_MAX, DBL_NORM_MAX og LDBL_NORM_MAX er lagt til float.h- og math.h-overskriftsfilene.
- Lagt til forprosessordirektiver #elifdef, #elifndef, #advarsel og #embed. "#embed" er ment for å integrere binære ressurser.
- Bruken av variadiske lister er forenklet.
- Mulighetene for oppregninger er utvidet.
- Lagt til støtte for "%b"-erstatningen for håndtering av binære verdier i funksjonsfamiliene printf() og scanf().
- Å kalle realloc() med null størrelse er nå udefinert oppførsel.
- Funksjonene memccpy(), strdup(), strndup(), gmtime_r() og localtime_r() har blitt standardisert.
- Funksjonene asctime() og ctime() er avviklet.
- Makroene static_assert og thread_local er flyttet til søkeordkategorien.
Kilde: opennet.ru
