Letzte Änderungen in C11

Lesezeit: 7 Minuten

Benutzeravatar von JC Salomon
JC Salomon

Aus C1x wurde ISO/IEC 9899:2011, auch bekannt als C11.

Weiß jemand, welche Änderungen (falls vorhanden) es im Standard von der gibt April 2011 Entwurf n1570?

ETA: Es gibt das Ausschussprotokoll von London (März 2011) (das in n1570 enthalten sein sollte) hierund aus Washington, DC (Oktober 2011) hier; Ich nehme an, eine Liste akzeptierter Änderungen im DC-Protokoll sollte die Dinge abdecken.

  • Laut einem Kommentar von Larry Jones auf comp.std.c gab es keine signifikanten Änderungen gegenüber N1569 (was N1570 ohne Änderungsmarkierungen ist). Ungelöst bleibt nur der Wert für __STDC_VERSION__aber ich denke, am natürlichsten wird es sein 201112L.

    – Jens Gustedt

    25. Dezember 2011 um 21:52 Uhr

  • Danke für diese Info, @JensGustedt. Übrigens habe ich auf n1570 verlinkt, weil dieser Link öffentlich zugänglich ist; n1569 kann auch heruntergeladen werden, aber nicht direkt.

    – JC Salomon

    26. Dezember 2011 um 19:47 Uhr


  • @JohanBezem, haben sie das sogar vergessen? So können wir den ersten Fehlerbericht herausgeben 🙂 Zum Glück werden hier nur Ganzzahlen verwendet, also alles durch Testen gegen 201100L sollte sicher sein.

    – Jens Gustedt

    5. Januar 2012 um 7:24 Uhr

  • @JensGustedt Ich habe gerade meinen eigenen Kommentar gelöscht, da du die Situation bereits beschrieben hast, da ist nichts hinzuzufügen. Ich nehme an, dass dies für eine „erste Veröffentlichung“ normal ist, da der ISO-Prozess ziemlich kompliziert ist und Sie nie wissen, ob er vor Weihnachten fertig sein wird, aber Sie müssen das endgültige Proof-Ready-Dokument liefern. Ich denke, wir sollten es besser so verwenden, wie Sie es vorschlagen < 201100L oder >= 201101L. Aber ich denke, das ist kein Mangel.

    – Johan Bezem

    5. Januar 2012 um 7:29 Uhr


  • Ich lese auch das n1570 im Detail und untersuche die Unterschiede zwischen ihm und dem endgültigen Standard. Ich konzentriere mich hauptsächlich auf die endgültige Typhierarchie der Sprache.

    – Krzysztof Abramowicz

    22. Januar 2014 um 18:19 Uhr

Benutzeravatar von Keith Thompson
Keith Thompson

Ich habe heute erst erfahren, dass es eine (etwas) signifikante Änderung zwischen N1570 und dem endgültigen C11-Standard (ISO/IEC 9899:2011 (E)) gab.

In N1570 sagt 6.3.2p3:

Außer wenn es der Operand von ist sizeof Betreiber, der _Alignof
Operator oder das Unäre & -Operator oder ist ein Zeichenfolgenliteral, das zum Initialisieren eines Arrays verwendet wird, eines Ausdrucks vom Typ „Array of Typ” wird in einen Ausdruck vom Typ “Zeiger auf Typ“, das auf das Anfangselement des Array-Objekts zeigt und kein Lvalue ist.

Die Aufnahme von _Alignof war ein Fehler, da die Syntax von a unärer Ausdruck Genehmigungen

_Alignof ( type-name )

aber nicht

_Alignof unary-expression

Der veröffentlichte C11-Standard korrigiert diesen Fehler und kehrt zum C99-Wortlaut zurück:

Außer wenn es der Operand von ist sizeof Operator oder das Unäre & -Operator oder ist ein Zeichenfolgenliteral, das zum Initialisieren eines Arrays verwendet wird, eines Ausdrucks vom Typ „Array of Typ” wird in einen Ausdruck vom Typ “Zeiger auf Typ“, das auf das Anfangselement des Array-Objekts zeigt und kein Lvalue ist.

Weitere Informationen: In einem kürzlich auf comp.std.c veröffentlichten Beitrag über Unterschiede zwischen N1570 und dem veröffentlichten Standard schrieb Larry Jones, ein Mitglied des ISO-C-Komitees:

Es gibt eine Reihe von ihnen, aber die meisten sind nur geringfügige redaktionelle Optimierungen, Änderungen am Standardtext und das Mischen von Dingen, um die Mächte glücklich zu machen. Die größte Änderung war das Entfernen von _Alignof von einer Reihe von Stellen, an denen es nicht hätte hinzugefügt werden sollen (basierend auf der irrtümlichen Vorstellung, dass es entweder einen Typ oder einen Ausdruck akzeptiert, wie es sizeof tut, wenn es wirklich nur einen Typ akzeptiert): 6.3.2.1p2, p3, p4, fn. 65; und 6.7.1 fn. 121.

Nachrichten ID: <[email protected]>

Hier ist der Faden wie auf groups.google.com zu sehen.

Benutzeravatar von JC Salomon
JC Salomon

Beantwortet von Jens Gustedt in den Kommentaren:

Laut einem Kommentar von Larry Jones auf comp.std.c gab es keine signifikanten Änderungen gegenüber N1569 (das ist N1570 ohne Änderungsmarkierungen). Ungelöst bleibt nur der Wert für __STDC_VERSION__aber ich denke, am natürlichsten wird es sein 201112L.

  • Der offizielle Standard von 2011 ist übrig __STDC_VERSION__ und das fakultative __STDC_LIB_EXT1__ falsch definiert. Das erste technische Korrigendum definierte beide als 201112L.

    – Keith Thompson

    19. März 2013 um 22:37 Uhr

ISO hat den neuen C11 (C1x)-Standard für die Programmiersprache C ratifiziert und als ISO/IEC 9899:2011 veröffentlicht. Die wichtigsten Änderungen gegenüber dem vorherigen Standard (C99), wie in der beschrieben C11-Wikipedia-Artikelsind die folgenden:

Der Standard enthält mehrere Änderungen an den C99-Sprach- und Bibliotheksspezifikationen, wie zum Beispiel:

  • Ausrichtungsspezifikation (_Alignas Spezifizierer, _Alignof Operator, aligned_alloc Funktion, <stdalign.h> Header-Datei)
  • Das _Noreturn Funktionsbezeichner
  • Geben Sie generische Ausdrücke mit dem ein _Generic Stichwort. Beispielsweise das folgende Makro cbrt(x) wird übersetzt in cbrtl(x), cbrt(x) oder cbrtf(x) je nach art x:

        #define cbrt(X) _Generic((X), long double: cbrtl, \
                                      default: cbrt, \
                                      float: cbrtf)(X)
    
  • Multithreading-Unterstützung (_Thread_local Speicherklassenbezeichner, <threads.h> Header einschließlich Thread-Erstellungs-/Verwaltungsfunktionen, Mutex, Bedingungsvariable und Thread-spezifische Speicherfunktionen sowie die _Atomic Typqualifizierer und <stdatomic.h> für unterbrechungsfreien Objektzugriff).
  • Verbesserte Unicode-Unterstützung basierend auf dem C Unicode Technical Report ISO/IEC TR 19769:2004 (char16_t und char32_t Typen zum Speichern von UTF-16/UTF-32-codierten Daten, einschließlich Konvertierungsfunktionen in <uchar.h> und das entsprechende u und U String-Literal-Präfixe sowie die u8 Präfix für UTF-8-codierte Literale).
  • Entfernung der gets Funktion, veraltet in der vorherigen Überarbeitung des C-Sprachstandards, ISO/IEC 9899:1999/Cor.3:2007(E), zugunsten einer neuen sicheren Alternative, gets_s.
  • Bounds-Checking-Schnittstellen (Anhang K).
  • Analysierbarkeitsmerkmale (Anhang L).
  • Weitere Makros zum Abfragen der Eigenschaften von Fließkommatypen bezüglich subnormaler Fließkommazahlen und der Anzahl der Dezimalstellen, die der Typ speichern kann.
  • Anonym Strukturen und Gewerkschaftennützlich, wenn Unions und Strukturen verschachtelt sind, z. B. in struct T { int tag; union { float x; int n; }; };.
  • Statische Zusicherungen, die während der Übersetzung zu einem späteren Zeitpunkt ausgewertet werden #if und #errorwenn Typen vom Übersetzer verstanden werden.
  • Ein exklusiver Erstellungs- und Öffnungsmodus ("…x" Zusatz) für fopen. Das verhält sich wie O_CREAT|O_EXCL in POSIX, das üblicherweise für Sperrdateien verwendet wird.
  • Das quick_exit Funktion als dritte Möglichkeit, ein Programm zu beenden, um bei Beendigung mit zumindest eine minimale Deinitialisierung durchzuführen exit scheitert.
  • Makros für den Aufbau komplexer Werte (teilweise weil real + imaginary*I liefert möglicherweise nicht den erwarteten Wert, wenn imaginary ist unendlich oder NaN).

Auf der ISO-Site können Sie die vollständig veröffentlichter Standard. Hier ist eine Zusammenfassung von der ISO-Site:

ISO/IEC 9899:2011 spezifiziert die Form und legt die Interpretation von Programmen fest, die in der Programmiersprache C geschrieben sind. Es spezifiziert

  • die Darstellung von C-Programmen;
  • die Syntax und Einschränkungen der C-Sprache;
  • die semantischen Regeln zur Interpretation von C-Programmen;
  • die Darstellung von Eingabedaten, die von C-Programmen verarbeitet werden sollen;
  • die Darstellung von Ausgabedaten, die von C-Programmen erzeugt werden;
  • die Beschränkungen und Grenzen, die durch eine konforme Implementierung von C auferlegt werden.

ISO/IEC 9899:2011 spezifiziert nicht

  • der Mechanismus, durch den C-Programme für die Verwendung durch ein Datenverarbeitungssystem transformiert werden;
  • der Mechanismus, durch den C-Programme zur Verwendung durch ein Datenverarbeitungssystem aufgerufen werden;
  • der Mechanismus, durch den Eingabedaten für die Verwendung durch ein C-Programm transformiert werden;
  • der Mechanismus, durch den Ausgangsdaten transformiert werden, nachdem sie von einem C-Programm erzeugt wurden;
  • die Größe oder Komplexität eines Programms und seiner Daten, die die Kapazität eines bestimmten Datenverarbeitungssystems oder die Kapazität eines bestimmten Prozessors überschreiten;
  • alle Mindestanforderungen an ein Datenverarbeitungssystem, das in der Lage ist, eine konforme Implementierung zu unterstützen. ISO/IEC 9899:2011 soll die Portabilität von C-Programmen zwischen einer Vielzahl von Datenverarbeitungssystemen fördern. Es ist für die Verwendung durch Implementierer und Programmierer vorgesehen.

  • Dies versucht nicht einmal, die gestellte Frage zu beantworten, die nichts mit den Unterschieden zwischen C11 und C99 zu tun hatte.

    – Mark Amery

    3. April 2016 um 17:53 Uhr

  • Ich stimme @MarkAmery zu. Die Frage bezog sich auf Unterschiede zwischen N1570 und dem endgültig veröffentlichten C11.

    – AJM

    5. Mai 2021 um 14:30 Uhr

1386570cookie-checkLetzte Änderungen in C11

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy