GCC 15 bude výchozí standard C23

Do kódu, na jehož základě se připravuje plánované jarní vydání sady kompilátorů GCC 15, bylo přijato změna, která jako výchozí používá standard C23 s rozšířeními GNU („-std=gnu23“) při kompilaci programů v jazyce C (dříve byl výchozím standardem C17 — „-std=gnu17“). Změna by mohla potenciálně způsobit problémy při sestavování stávajících projektů, protože v novém standardu jsou rozdíly, jako přidání konstanty nullptr, typu _BitInt(n) a klíčových slov bool, true a false, které mohou kolidovat s identifikátory se stejnými názvy v aplikacích.

Standard C23 (ISO/IEC 9899:2024) byl oficiálně publikován mezinárodní organizací pro standardizaci (ISO) 31. října 2024. Mezi změnami v novém standardu:

  • Byla odstraněna možnost definice funkcí ve stylu K&R C, který byl používán před přijetím specifikace ANSI C a byl popsán v knize „The C Programming Language“ od Kernighana a Ritchieho. Styl K&R předpokládá popis typů argumentů po definici funkce; například: „int add(a, b) int a, b; {}“
  • Nepojmenované parametry funkcí — možnost neuvedení jmen nepoužívaných parametrů při definici funkcí (jak v C++). Například nyní lze psát „int f(int, int) { return 7; }“.
  • Podpora syntaxe „[[jméno]]“ pro definici atributů jako v C++ („[[gnu::const]]“, „[[deprecated]]“, „[[fallthrough]]“, „[[maybe_unused]]“, „[[nodiscard]]“, „[[noreturn]]“, „[[reproducible]]“, „[[unsequenced]]“). Například atribut [[noreturn]] umožňuje specifikovat, že funkce nevrací hodnoty (hlavičkový soubor stdnoreturn.h a specifikátor „_Noreturn“ byly prohlášeny za zastaralé).
  • Podpora syntaxe u8 pro definici konstant se znaky v UTF-8.
  • Byl přidán typ char8_t pro řetězce a znaky v kódování UTF-8, stejně jako funkce pro převod řetězců s vícibajtovými znaky mbrtoc8() a c8rtomb().
  • Došlo ke změně chování klíčového slova „auto“, které nyní vede k odvození typu při definici objektů, což umožňuje používat označení „auto“ místo typu pro určení typu proměnných na základě typu výrazu pro jejich inicializaci. Například: „auto y = cos(x);“.
  • Funkce s prázdným seznamem argumentů jsou nyní zpracovávány jako funkce, které nepřijímají argumenty.
  • Byla přidána podpora pro hlavičkové soubory a s makry, funkcemi a typy pro kontrolu celých čísel.
  • Povolení umístění přechodových značek na jakémkoli místě v rámci složených výrazů.
  • Byla zrušena podpora ve kódu trigrafů, sekvencí tří ASCII znaků zpracovávaných jako jeden znak, například sekvenci "??=" bylo možné použít místo "#". Po zavedení Unicode ztratila podpora trigrafů smysl.
  • Byla přidána podpora prefixů "0b" a "0B" pro označení celých hodnot v binární formě, například "int b = 0b101010".
  • Byla přidána klíčová slova bool, static_assert, alignas, alignof a thread_local.
  • Povolení učení prázdných závorek "{}" pro inicializaci na nulové hodnoty, t.j. nyní lze psát "struct S { int x, y } s = {};".
  • Byla poskytnuta možnost zadávat jakákoli univerzální jména symbolů v literálech znaků a řetězců. Například, "int \u0024 = 0;".
  • Do "stddef.h" byl přidán makro "unreachable".
  • Byl přidán nový typ nullptr_t a konstanta nullptr pro definici nulových ukazatelů, které mohou být konvertovány na jakýkoli typ ukazatelů a reprezentují variantu NULL, která není vázána na celočíselné typy a typ void*. Například, lze uvést "void func(nullptr_t); func(0); func((void *)0);".
  • Byly přidány typy "_BitInt (N)" a "unsigned _BitInt (N)" pro definici celých čísel s uvedeným počtem bitů, a také desítkové typy s plovoucí desetinnou čárkou "_Decimal32", "_Decimal64" a "_Decimal128" a funkce pro práci s těmito typy.
  • Byla přidána možnost použití znaku "‘" pro názorné oddělování číslic v číslech (například "1’000’000").
  • Struktury, unie a výčty je nyní možné definovat více než jednou ve stejné oblasti platnosti se stejným obsahem a opakujícími se štítky.
  • Do standardu byly zahrnuty operátory typeof a typeof_unqual.
  • Objevila se podpora používání specifikátoru constexpr pro definici objektů.
  • Do hlavičkových souborů float.h a math.h byly přidány makra INFINITY, NAN, FLT_NORM_MAX, DBL_NORM_MAX a LDBL_NORM_MAX.
  • Byly přidány direktivy předprocesoru #elifdef, #elifndef, #warning a #embed. "#embed" je určen pro integraci binárních zdrojů.
  • Bylo zjednodušeno používání seznamů s proměnným počtem argumentů (variadic).
  • Byly rozšířeny možnosti výčtů (enum).
  • Byla přidána podpora pro substituci „%b“ pro zpracování binárních hodnot ve skupinách funkcí printf() a scanf().
  • Volání funkce realloc() s nulovou velikostí bylo převedeno na kategorii nespecifikovaného chování.
  • Funkce memccpy(), strdup(), strndup(), gmtime_r() a localtime_r() byly standardizovány.
  • Funkce asctime() a ctime() byly prohlášeny za zastaralé.
  • Makra static_assert a thread_local byla převedena do kategorie klíčových slov.

Zdroj: opennet.ru

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster