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.
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.
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
.
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 #error
wenn 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.
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 sein201112L
.– 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