GCC 15 kasutab vaikimisi C23 standardit

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

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster