A kódalap, amely alapján a jövő év tavaszán tervezett GCC 15 fordítókészlet kiadása készül, módosítást fogadott el, amely alapértelmezésben a GNU kiterjesztésekkel rendelkező C23 szabvány használatát tartalmazza („-std=gnu23”) a C programok fordítása során (korábban az alapértelmezett C17 szabvány volt — „-std=gnu17”). A módosítás potenciálisan problémát okozhat a meglévő projektek összeállításakor, mivel az új szabványban eltérések találhatók, például a nullptr konstans, a _BitInt(n) típus és a bool, true és false kulcsszavak bevezetése, amelyek ütközhetnek a programokban meghatározott azonosítókkal.
A C23 szabvány (ISO/IEC 9899:2024) hivatalosan megjelent a Nemzetközi Szabványügyi Szervezet (ISO) által 2024. október 31-én. Az új szabványban található változások közül:
- Eltávolították a K&R C stílusú függvények definíciójának lehetőségét, amelyet az ANSI C specifikációjának elfogadása előtt használtak, és amelyet a Kernighan és Ritchie által írt «The C Programming Language» könyv is ismertet. A K&R stílus értelmében a paraméterek típusait a függvény definiálása után kell megadni, például: «int add(a, b) int a, b; {};»
- Névtelen függvényparaméterek — nem kötelező a fel nem használt paraméterek neveinek megadása a függvények definiálásakor (ahogy C++-ban). Például mostantól lehet írni: «int f(int, int) { return 7; }».
- A C++-ra jellemző «[[név]]» szintaxis támogatása attribútumok definiálására («[[gnu::const]]», «[[deprecated]]», «[[fallthrough]]», «[[maybe_unused]]», «[[nodiscard]]», «[[noreturn]]», «[[reproducible]]», «[[unsequenced]]»). Például a [[noreturn]] attribútum lehetővé teszi, hogy jelezzük, hogy a függvény nem ad vissza értékeket (a stdnoreturn.h fejlécfájl és az „_Noreturn” specifikátor elavultnak számít).
- Az u8” szintaxis támogatása UTF-8 karakterekkel rendelkező konstansok definiálására.
- Bevezetésre került a char8_t típus az UTF-8 kódolású szövegek és karakterek számára, valamint függvények a többbájtú karakterekből való szöveggé alakításhoz: mbrtoc8() és c8rtomb().
- Megváltozott az «auto» kulcsszó működése, amely mostantól a típusok kimenetéhez vezet objektumok definiálásakor, lehetővé téve az «auto» jelző használatát a változók típusának a kifejezés típusán alapuló meghatározásához. Például: «auto y = cos(x);».
- A paraméterlistával rendelkező üres függvények most már úgy vannak kezelve, mint azok a függvények, amelyek nem fogadnak el paramétereket.
- Hozzáadva a és a fejlécek támogatása makrókkal, függvényekkel és típusokkal az egész számok számításainak ellenőrzésére.
- Áttérhet több helyre a címkék elhelyezése a bonyolult kifejezések belsejében.
- Megszűnt a trigráfok támogatása a kódban, három ASCII karakterből álló sorozatok, amelyek egy karakterként kerültek feldolgozásra, például a «??=» sorozat használható volt a «#» helyett. A Unicode megjelenésével a trigráfok támogatása értelmét vesztette.
- Hozzáadva a «0b» és «0B» előtagok támogatása az egész számok bináris formában történő megadásához, például «int b = 0b101010».
- Hozzáadva a bool, static_assert, alignas, alignof és thread_local kulcsszavak.
- Megengedett üres zárójelek «{}» használata a null értékek inicializálásához, azaz mostantól írható «struct S { int x, y } s = {}; ».
- Lehetővé tette bármilyen univerzális karakternevek megadását karakter- és karakterlánc literálokban. Például, «int \u0024 = 0; ».
- A «stddef.h» fájlba hozzáadva a «unreachable» makrót.
- Hozzáadva egy új nullptr_t típus és nullptr konstans a null pointerek meghatározásához, amelyek bármilyen pointer típusra átkonvertálhatók, és a NULL változataként is szolgálhatnak, amely nem kötődik az egész szám típusokhoz és a void* típushoz. Például lehet megadni «void func(nullptr_t); func(0); func((void *)0); ».
- Hozzáadva a «_BitInt (N)» és «unsigned _BitInt (N)» típusok az adott számú bitből álló egész számok meghatározásához, valamint a «_Decimal32», «_Decimal64» és «_Decimal128» lebegőpontos tizedes típusok, és funkciók ezen típusok kezelésére.
- Lehetővé téve a «‘» karakter használatát a számok helyiértékének szemléletes elválasztására (például «1’000’000»).
- Struktúrák, egyesítések és felsorolások több alkalommal is meghatározhatók egyazon láthatósági környezetben ugyanazzal a tartalommal és ismétlődő címkékkel.
- A standardba belekerültek a typeof és a typeof_unqual operátorok.
- Támogatást nyert a constexpr jelző használata objektumok meghatározásához.
- A float.h és math.h fejlécfájlokba hozzáadta az INFINITY, NAN, FLT_NORM_MAX, DBL_NORM_MAX és LDBL_NORM_MAX makrókat.
- Hozzáadva préprocesszor direktívák: #elifdef, #elifndef, #warning és #embed. A «#embed» a bináris erőforrások integrálására szolgál.
- Egyszerűsítve van a változó számú argumentumú (variadic) listák használata.
- Kibővítve a felsorolások (enum) képességei.
- Hozzáadva a «%b» helyettesítő támogatás a printf() és scanf() függvények bináris értékeinek feldolgozásához.
- A realloc() függvény nullás mérettel való hívása határozatlan viselkedésre vált.
- A memccpy(), strdup(), strndup(), gmtime_r() és localtime_r() függvények szabványosítva lettek.
- Elavultnak nyilvánították az asctime() és ctime() függvényeket.
- A static_assert és thread_local makrók kulcsszavakként lettek nyilvánítva.
Forrás: opennet.ru
