GCC 15 wird standardmĂ€ĂŸig den C23 Standard verwenden

In den Code-Basis, auf deren Grundlage die geplante Veröffentlichung des GCC 15 Compiler-Pakets im FrĂŒhjahr nĂ€chsten Jahres erfolgt, wurde eine Änderung ĂŒbernommen, die standardmĂ€ĂŸig die Verwendung des C23-Standards mit GNU-Erweiterungen ("-std=gnu23") beim Kompilieren von Programmen in der Programmiersprache C einschließt (zuvor wurde der Standard C17 - "-std=gnu17" - verwendet). Die Änderung könnte potenziell zu Problemen beim Zusammenbau bestehender Projekte fĂŒhren, da im neuen Standard Unterschiede bestehen, wie die HinzufĂŒgung der Konstante nullptr, des Typs _BitInt(n) sowie der SchlĂŒsselwörter bool, true und false, die mit in den Anwendungen definierten gleichnamigen Identifikatoren in Konflikt stehen könnten.

Der C23-Standard (ISO/IEC 9899:2024) wurde am 31. Oktober 2024 von der Internationalen Organisation fĂŒr Normung (ISO) offiziell veröffentlicht. Zu den Änderungen im neuen Standard gehören:

  • Die Möglichkeit, Funktionen im K&R C-Stil zu definieren, der vor der Annahme der ANSI C-Spezifikation verwendet wurde und in dem Buch „The C Programming Language“ von Kernighan und Ritchie beschrieben wird, wurde entfernt. Der K&R-Stil umfasst die Beschreibung der Argumenttypen nach der Funktionsdefinition, beispielsweise „int add(a, b) int a, b; {}“
  • Unbenannte Funktionsparameter - die Unverbindlichkeit der Angabe von Namen nicht verwendeter Parameter bei der Funktionsdefinition (wie in C++). Zum Beispiel kann jetzt geschrieben werden: „int f(int, int) { return 7; }“.
  • UnterstĂŒtzung der Syntax „[[name]]“ zur Definition von Attributen wie in C++ („[[gnu::const]]“, „[[deprecated]]“, „[[fallthrough]]“, „[[maybe_unused]]“, „[[nodiscard]]“, „[[noreturn]]“, „[[reproducible]]“, „[[unsequenced]]“). Beispielsweise ermöglicht das Attribut [[noreturn]], anzugeben, dass eine Funktion keine Werte zurĂŒckgibt (die Header-Datei stdnoreturn.h und der Spezifizierer „_Noreturn“ sind als veraltet erklĂ€rt worden).
  • UnterstĂŒtzung der Syntax u8“ zur Definition von Konstanten mit Zeichen in UTF-8.
  • Der Typ char8_t fĂŒr Strings und Zeichen in UTF-8-Codierung sowie Funktionen zur Umwandlung von Strings mit Mehrbyte-Zeichen mbrtoc8() und c8rtomb() wurden hinzugefĂŒgt.
  • Die Funktionsweise des SchlĂŒsselworts „auto“ wurde geĂ€ndert, das jetzt zur Typableitung bei der Definition von Objekten fĂŒhrt, was es ermöglicht, das Kennzeichen „auto“ anstelle des Typs zu verwenden, um den Typ von Variablen basierend auf dem Ausdruckstyp ihrer Initialisierung zu bestimmen. Zum Beispiel: „auto y = cos(x);“.
  • Funktionen mit leerer Parameterliste werden jetzt als Funktionen behandelt, die keine Argumente akzeptieren.
  • Die UnterstĂŒtzung fĂŒr die Header-Dateien und wurde hinzugefĂŒgt, einschließlich Makros, Funktionen und Typen zur ÜberprĂŒfung ganzzahliger Berechnungen.
  • Das Setzen von Sprungmarken an beliebigen Stellen innerhalb von zusammengesetzten AusdrĂŒcken wurde erlaubt.
  • Die UnterstĂŒtzung von Trigraphen im Code wurde eingestellt, dabei handelt es sich um Sequenzen von drei ASCII-Zeichen, die als ein Zeichen behandelt werden, z.B. konnte die Sequenz '??=' anstelle von '#' verwendet werden. Nach der EinfĂŒhrung von Unicode ist die UnterstĂŒtzung von Trigraphen nicht mehr sinnvoll.
  • Die UnterstĂŒtzung der PrĂ€fixe '0b' und '0B' zur Angabe ganzzahliger Werte in binĂ€rer Form wurde hinzugefĂŒgt, z.B. 'int b = 0b101010'.
  • Die SchlĂŒsselwörter bool, static_assert, alignas, alignof und thread_local wurden hinzugefĂŒgt.
  • Das Angeben von leeren geschweiften Klammern '{}' zur Initialisierung auf null-Werte wurde erlaubt, d.h. nun kann geschrieben werden 'struct S { int x, y } s = {};'.
  • Die Möglichkeit wurde geschaffen, beliebige universelle Symbolnamen in Zeichen- und Stringliteralen anzugeben. Zum Beispiel 'int \u0024 = 0;'.
  • Im 'stddef.h' wurde das Makro 'unreachable' hinzugefĂŒgt.
  • Ein neuer Typ nullptr_t und die Konstante nullptr wurden hinzugefĂŒgt, um null-Zeiger zu definieren, die in jeden Zeigertyp umgewandelt werden können und eine NULL-Variante reprĂ€sentieren, die nicht an ganzzahlige Typen und den Typ void* gebunden ist. Zum Beispiel kann geschrieben werden 'void func(nullptr_t); func(0); func((void *)0);'.
  • Die Typen '_BitInt (N)' und 'unsigned _BitInt (N)' wurden hinzugefĂŒgt, um ganze Zahlen mit einer bestimmten Anzahl von Bits zu definieren, sowie die dezimalen Gleitkommatypen '_Decimal32', '_Decimal64' und '_Decimal128' und Funktionen zur Bearbeitung solcher Typen.
  • Die Verwendung des Zeichens '‘' zur anschaulichen Trennung von Ziffern in Zahlen wurde hinzugefĂŒgt (z.B. '1’000’000').
  • Strukturen, Vereinigungen und AufzĂ€hlungen dĂŒrfen mehr als einmal im selben Geltungsbereich mit demselben Inhalt und wiederholendem Tag definiert werden.
  • In den Standard wurden die Operatoren typeof und typeof_unqual aufgenommen.
  • Die UnterstĂŒtzung des Spezifizierers constexpr zur Definition von Objekten ist hinzugekommen.
  • In die Header-Dateien float.h und math.h wurden die Makros INFINITY, NAN, FLT_NORM_MAX, DBL_NORM_MAX und LDBL_NORM_MAX aufgenommen.
  • Es wurden die PrĂ€prozessor-Direktiven #elifdef, #elifndef, #warning und #embed hinzugefĂŒgt. '#embed' ist fĂŒr die Integration binĂ€rer Ressourcen vorgesehen.
  • Die Verwendung von Listen mit variabler Anzahl von Argumenten (variadic) wurde vereinfacht.
  • Die Möglichkeiten von AufzĂ€hlungen (enum) wurden erweitert.
  • Die UnterstĂŒtzung fĂŒr den Platzhalter „%b“ zur Verarbeitung von binĂ€ren Werten in den printf()- und scanf()-Funktionsfamilien wurde hinzugefĂŒgt.
  • Ein Aufruf der Funktion realloc() mit null GrĂ¶ĂŸe wurde als undefiniertes Verhalten eingestuft.
  • Die Funktionen memccpy(), strdup(), strndup(), gmtime_r() und localtime_r() wurden standardisiert.
  • Die Funktionen asctime() und ctime() wurden als veraltet erklĂ€rt.
  • Die Makros static_assert und thread_local wurden in die Kategorie der SchlĂŒsselwörter eingestuft.

Quelle: opennet.ru

60GB SSD 8Gb DDR4