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
