Koodibaasi, mille põhjal on kavandatud järgmise aasta kevadiseks väljaandmiseks GCC 15 kompilaatorite komplekt, on tehtud muudatus, mis sisaldab vaikimisi C23 standardi kasutamist koos GNU laiendustega («-std=gnu23») C programmeerimise kompileerimisel (varem kasutati vaikimisi C17 standardit — «-std=gnu17»). Muudatus võib potentsiaalselt põhjustada probleeme olemasolevate projektide koostamisel, kuna uues standardis on erinevusi, nagu konstant nullptr, tüüp _BitInt(n) ning märksõnad bool, true ja false, mis võivad konflikti minna rakendustes määratud sama nimega identifikaatoritega.
C23 standard (ISO/IEC 9899:2024) avaldati ametlikult rahvusvahelise standardimisorganisatsiooni (ISO) poolt 31. oktoobril 2024. Uue standardi muudatuste seas on:
- Kasutusele ei võeta enam K&R C stiilis funktsioonide määratlemise võimalust, mida kasutati enne ANSI C spetsifikatsiooni vastuvõtmist ja mida kirjeldatakse Kernighani ja Ritchie raamatus «The C Programming Language». K&R stiil tähendab, et argumendi tüüpe määratakse pärast funktsiooni määratlemist, näiteks «int add(a, b) int a, b; {}».
- Nimetamata funktsiooniparametrid — nõue, et kasutamata parameetrite nimesid ei pea määratlemisel esitama (nagu C++-s). Näiteks võib nüüd kirjutada «int f(int, int) { return 7; }».
- Tuginedes C++-le, on toetatud süntaks [[nimi]] atribuutide määratlemiseks («[[gnu::const]]», «[[deprecated]]», «[[fallthrough]]», «[[maybe_unused]]», «[[nodiscard]]», «[[noreturn]]», «[[reproducible]]», «[[unsequenced]]»). Näiteks atribuut [[noreturn]] võimaldab märkida, et funktsioon ei naasta väärtusi (pealkirjafail stdnoreturn.h ja spetsifikaator «_Noreturn» on kuulutatud vananenuks).
- Toetatakse süntaksit u8» konstantide määratlemiseks, milles on UTF-8 sümbolid.
- Lisatud tüüp char8_t UTF-8 kodeeringus stringide ja sümbolite jaoks, samuti funktsioonid mitme baidi sümbolite stringide konverteerimiseks mbrtoc8() ja c8rtomb().
- Muutunud on märksõna «auto» tegevus, mis nüüd toob kaasa tüübi tuvastamise objektide määratlemisel, võimaldades kasutada tunnust «auto» variandi tüübi määramiseks nende algväärtustamiseks. Näiteks: «auto y = cos(x);».
- Tühjade argumentide loeteloomadega funktsioonid käsitletakse nüüd kui argumente vastu võtmata funktsioonid.
- Toetatud on päisefailid ja , mis sisaldavad makrosid, funktsioone ja tüüpe täisarvuliste arvutuste kontrollimiseks.
- On lubatud paigutada hübriidmarkereid igasugustes kohtades koos komposiitväljenditega.
- Toetuse lõpetamine koodis trigraafide jaoks, kolme ASCII-märgi järjestused, mida tõlgendatakse kui üht märki, näiteks järjestust «??=» võiks kasutada «#» asemel. Pärast Unicode'i tekkimist kaotas trigraafide tugi tähenduse.
- Toetatud on eelprefiksid «0b» ja «0B» täisarvude näitamiseks binaarses formaadis, näiteks «int b = 0b101010».
- Lisatud on võtmesõnad bool, static_assert, alignas, alignof ja thread_local.
- Lubatud on kasutada tühje sulge «{}» algväärtustamiseks nullväärtusteks, st nüüd on võimalik kirjutada «struct S { int x, y } s = {};».
- Antud on võimalus kasutada mis tahes universaalseid sümbolite nimesid karakteri- ja stringliteraalides. Näiteks «int \u0024 = 0;».
- Failis «stddef.h» on lisatud makro «unreachable».
- Lisatud on uus tüüp nullptr_t ja konstant nullptr nullviidikute määramiseks, mis võivad konverteeruda mis tahes viidikutüüpi ja esindada varianti NULL, mis ei ole seotud täisarvutüüpide ja tüübi void* puhul. Näiteks on võimalik määrata «void func(nullptr_t); func(0); func((void *)0);».
- Lisatud on tüübid «_BitInt (N)» ja «unsigned _BitInt (N)» täisarvude määratlemiseks, millel on määratud bittide arv, samuti ujuvad kümnenditüübid «_Decimal32», «_Decimal64» ja «_Decimal128» ning funktsioonid nende tüüpidega töötamiseks.
- Lisatud on sümboli «‘» kasutamise võimalus numbrite kohalike kohtade selgemaks eraldamiseks (nt «1’000’000»).
- Struktuure, ühinemisi ja loendeid on lubatud määratleda rohkem kui üks kord samas ulatuses sama sisuga ja korduva sildiga.
- Standardisse on lisatud operaatorid typeof ja typeof_unqual.
- On tekkinud toetus spetsifikatori constexpr kasutamiseks objektide määratlemiseks.
- Pealkirjafailides float.h ja math.h on lisatud makrod INFINITY, NAN, FLT_NORM_MAX, DBL_NORM_MAX ja LDBL_NORM_MAX.
- Lisatud on eelprotsessoridirektiivid #elifdef, #elifndef, #warning ja #embed. «#embed» on ette nähtud binaarsete ressursside integreerimiseks.
- Lihtsustatud on variatiivsete argumentide (variadic) loendite kasutamine.
- Loendite (enum) võimalusi on laiendatud.
- Lisatud to支持 `%b` asendamine binaarsete väärtuste käsitlemiseks printf() ja scanf() funktsioonide perekondades.
- Funktsiooni realloc() nullsuurusega kutsumine on määratletud määramatuna.
- Funktsioonid memccpy(), strdup(), strndup(), gmtime_r() ja localtime_r() on standardiseeritud.
- Funktsioonid asctime() ja ctime() on kuulutatud aegunuks.
- Mikroskoopilised static_assert ja thread_local kuuluvad nüüd võtmesõnade hulka.
Allikas: opennet.ru
