GCC 15 wird standardmäßig C23 verwenden.

In den Codebasis, auf dessen Grundlage die für das Frühjahr nächsten Jahres geplante Veröffentlichung des GCC 15 Compiler-Sets erstellt wird, wurde eine Änderung aufgenommen, die die standardmäßige Verwendung des C23-Standards mit GNU-Erweiterungen („-std=gnu23“) beim Kompilieren von C-Programmen vorsieht (zuvor wurde standardmäßig der C17-Standard verwendet – „-std=gnu17“). Diese Änderung könnte potenziell zu Problemen beim Bauen bestehender Projekte führen, da es im neuen Standard Unterschiede gibt, wie die Hinzufügung von nullptr, dem Typ _BitInt(n) sowie den Schlüsselwörtern bool, true und false, die mit den in Anwendungen definierten gleichnamigen Identifikatoren in Konflikt geraten können.

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 ist, wurde entfernt. Der K&R-Stil bedeutet, dass die Typen der Argumente nach der Funktionsdefinition angegeben werden, z. B. „int add(a, b) int a, b; {}“.
  • Unbenannte Funktionsparameter – die Möglichkeit, Namen nicht verwendeter Parameter bei der Definition von Funktionen nicht anzugeben (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]]“). Zum Beispiel 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 für die Definition von Konstanten mit Zeichen in UTF-8.
  • Der Typ char8_t wurde für Zeichenfolgen und Zeichen in UTF-8-Kodierung hinzugefügt, sowie Funktionen zur Umwandlung von Zeichenfolgen mit Mehrbytezeichen: mbrtoc8() und c8rtomb().
  • Die Bedeutung des Schlüsselworts „auto“ wurde geändert, sodass es nun zum Typausgeben bei der Definition von Objekten führt, was die Verwendung des Merkmals „auto“ anstelle eines Typs zur Definition des Typs von Variablen basierend auf dem Typ des Ausdrucks für ihre Initialisierung ermöglicht. Zum Beispiel: „auto y = cos(x);“.
  • Funktionen mit leerer Argumentenliste werden jetzt als Funktionen behandelt, die keine Argumente annehmen.
  • Unterstützung für die Header-Dateien und mit Makros, Funktionen und Typen zur Überprüfung ganzzahliger Berechnungen wurde hinzugefügt.
  • Das Setzen von Sprungmarken an beliebigen Stellen innerhalb zusammengesetzter Ausdrücke ist erlaubt.
  • Die Unterstützung für Trigraphs im Code, eine Sequenz von drei ASCII-Zeichen, die als ein Zeichen verarbeitet wird, wurde eingestellt. Beispielsweise konnte die Sequenz „??=“ anstelle von „#“ verwendet werden. Nach der Einführung von Unicode hat die Unterstützung für Trigraphs an Bedeutung verloren.
  • Unterstützung für die 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.
  • Die Angabe leerer Klammern „{}“ zur Initialisierung auf Nullwerte ist erlaubt, d. h. jetzt kann man schreiben „struct S { int x, y } s = {};“.
  • Die Möglichkeit, beliebige universelle Bezeichner in Zeichen- und Stringliteralen anzugeben, wurde bereitgestellt. Beispielsweise „int \u0024 = 0;“.
  • Der Makro „unreachable“ wurde in „stddef.h“ hinzugefügt.
  • Ein neuer Typ nullptr_t und die Konstante nullptr wurden hinzugefügt, um Nullzeiger zu definieren, die in jeden Zeigertyp konvertiert werden können und eine NULL-Variante darstellen, die nicht an Ganzzahltypen und den Typ void* gebunden ist. Zum Beispiel kann angegeben werden: „void func(nullptr_t); func(0); func((void *)0);“.
  • Die Typen „_BitInt (N)“ und „unsigned _BitInt (N)“ wurden hinzugefügt, um Ganzzahlen mit einer bestimmten Anzahl von Bits zu definieren, sowie die Dezimaltypen „_Decimal32“, „_Decimal64“ und „_Decimal128“ und Funktionen zur Arbeit mit solchen Typen.
  • Es wurde die Möglichkeit hinzugefügt, das Zeichen „‘“ zur anschaulichen Trennung von Stellenwerten in Zahlen zu verwenden (zum Beispiel „1’000’000“).
  • Strukturen, Vereinigungen und Aufzählungen dürfen mehr als einmal im gleichen Gültigkeitsbereich mit demselben Inhalt und wiederholendem Tag definiert werden.
  • Die Operatoren typeof und typeof_unqual wurden in den Standard aufgenommen.
  • Die Unterstützung für die Verwendung des Spezifizierers constexpr zur Definition von Objekten wurde hinzugefügt.
  • Die Header-Dateien float.h und math.h wurden um die Makros INFINITY, NAN, FLT_NORM_MAX, DBL_NORM_MAX und LDBL_NORM_MAX ergänzt.
  • Die Präprozessor-Direktiven #elifdef, #elifndef, #warning und #embed wurden hinzugefügt. „#embed“ ist für die Integration von Binärressourcen vorgesehen.
  • Die Nutzung von Variadic-Argumentlisten wurde vereinfacht.
  • Die Möglichkeiten von Enumerationen (enum) wurden erweitert.
  • Unterstützung für die Platzhalter "%b" zur Verarbeitung binärer Werte wurde in die Funktion printf() und scanf() integriert.
  • Ein Aufruf der Funktion realloc() mit einer Größe von null wurde als undefiniertes Verhalten klassifiziert.
  • Die Funktionen memccpy(), strdup(), strndup(), gmtime_r() und localtime_r() wurden standardisiert.
  • Die Funktionen asctime() und ctime() wurden als veraltet deklariert.
  • Die Makros static_assert und thread_local wurden zu Schlüsselwörtern hinzugefügt.

Quelle: opennet.ru

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster