GCC 15 vil bruke C23-standarden som standard

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

Kjøp pålitelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere 🔥 Kjøp pålitelig webhotell med DDoS-beskyttelse, VPS VDS-servere | ProHoster