Was ist die standardmäßige C-std-Standardversion für den aktuellen GCC (insbesondere unter Ubuntu)?
Lesezeit: 8 Minuten
ncmathsadist
Wenn ich nach der aktuellen Version von cc frage, bekomme ich dies.
$ cc --version
cc (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$
Was ich gerne wissen würde, ist, welcher von c89, c90, c99 oder c11 verwendet wird.
C89 und C90 sind genau die gleiche Sprache. Der ANSI-C-Standard von 1989 und der ISO-C-Standard von 1990 unterscheiden sich nur in einigen (nicht normativen) Einführungsmaterialien und der Neunummerierung der Abschnitte. Die Standards C99 und C11 wurden ursprünglich von ISO veröffentlicht und dann von ANSI übernommen. (Der Begriff “ANSI C” bezieht sich immer noch eher auf C89/C90, obwohl offiziell C11 der aktuelle ANSI-Standard ist.)
– Keith Thompson
6. Februar 2013 um 19:35 Uhr
Keith Thompson
Dies wird ausführlich im gcc-Handbuch erklärt, das (falls installiert) durch Eingabe verfügbar ist info gcc oder online hier. Der entsprechende Abschnitt des Handbuchs 4.7.2 ist hier.
Standardmäßig entspricht gcc keinem der ANSI/ISO-C-Standards. Die aktuelle Standardeinstellung entspricht -std=gnu90, das ist der Standard von 1989/1990 mit GNU-spezifischen Erweiterungen. (Einige vom Sprachstandard geforderte Diagnosen werden nicht ausgegeben.) Version 5.1.0, veröffentlicht am 22.04.2015, änderte die Standardeinstellung von -std=gnu90 zu -std=gnu11, wie hier dokumentiert.
Wenn Sie Standardkonformität wünschen, können Sie eines der folgenden verwenden:
-std=c90 kann auch buchstabiert werden -ansi, -std=c89oder -std=iso9899:1990.
-std=iso9899:199409 unterstützt den C90-Standard plus die Änderung von 1995, die einige kleinere Funktionen hinzufügt (die alle auch in C99 enthalten sind).
-std=c99 kann auch buchstabiert werden -std=c9x oder -std=iso9899:1999 (der Name c9x verwendet wurde, bevor die Norm veröffentlicht wurde). C99-Unterstützung ist nicht ganz vollständigaber es ist nah.
-std=c11 kann auch buchstabiert werden -std=c0x oder -std=iso9899:2011 (der Name c0x wurde verwendet, bevor der endgültige Standard veröffentlicht wurde; das wurde fälschlicherweise angenommen x würde 9 nicht überschreiten). Die C11-Unterstützung ist ebenfalls unvollständig; der aktuelle Stand ist hier zusammengefasst.
Das -pedantic Option bewirkt, dass gcc die erforderlichen Diagnosen für Verletzungen von Beschränkungen und Syntaxregeln ausgibt. In einigen Fällen handelt es sich bei diesen Diagnosen lediglich um Warnungen – und es gibt keine einfache Möglichkeit, zwischen diesen Warnungen und anderen Warnungen zu unterscheiden, die für die Sprache nicht erforderlich sind. Ersetzen -pedantic durch -pedantic-errors um gcc zu veranlassen, Sprachverletzungen als schwerwiegende Fehler zu behandeln.
Eine kurze Geschichte des Standards:
C89 war der erste offizielle C-Standard, herausgegeben von ANSI 1989.
C90 war die ISO Version des Standards, die genau dieselbe Sprache wie C89 beschreibt. ANSI hat die ISO-Version des Standards offiziell übernommen. Es gab zwei technische Berichtigungen, in denen einige Fehler korrigiert wurden.
C95 war eine Ergänzung zu C90, die einige Funktionen hinzufügte, hauptsächlich Digraphen und Unterstützung für breite Zeichen. Soweit ich weiß, wurde nie eine zusammengeführte Version veröffentlicht.
C99 wurde 1999 von ISO herausgegeben. Es gab drei technische Berichtigungen.
C11 wurde 2011 von ISO herausgegeben. Es gab eine technische Berichtigung, in der die Definitionen von festgelegt wurden __STDC_VERSION__ und __STDC_LIB_EXT1__.
ANSI hat keine eigenen Versionen der Standards von 1999 oder 2011 herausgegeben und stattdessen die ISO-Standards übernommen.
N1256 ist ein frei verfügbarer Entwurf des C99-Standards, in den die 3 Technical Corrigenda integriert sind.
N1570 ist ein frei verfügbarer Entwurf des C11-Standards. Es gibt einige geringfügige Unterschiede zwischen ihm und dem veröffentlichten C11-Standard sowie eine technische Berichtigung. Weitere Einzelheiten finden Sie in meiner Antwort auf diese Frage.
Informationen zu den Unterschieden zwischen N1570 und C11 finden Sie unter stackoverflow.com/q/8631228/95580. Es gab keine Unterschiede: Sie haben sogar vergessen zu aktualisieren __STDC_VERSION__ und __STDC_LIB_EXT1__! (Dies wurde in Cor 1:2012 behoben; siehe stackoverflow.com/q/13914050/95580.)
– JC Salomon
19. März 2013 um 22:17 Uhr
@JCSalomon: Tatsächlich gab es eine semantisch signifikante Änderung. Ich habe den letzten Absatz meiner Antwort aktualisiert, um auf dieselbe Frage zu verlinken, auf die Sie verlinkt haben, und auf meine Antwort.
– Keith Thompson
22. Februar 2015 um 19:24 Uhr
@KeithThompson können wir es wagen, nach einem Update für 2021 zu fragen? C17 und vielleicht “C23, so weit”. Vielen Dank.
– Chef Gladiator
17. April 2021 um 12:33 Uhr
@ChefGladiator Im Moment ist es noch “C2X”. Ich bin mir nicht sicher, ob 2023 das ursprünglich vorgesehene Jahr war, aber ich habe keine Anzeichen dafür gesehen, dass sie speziell auf dieses Jahr abzielen.
2.1 C Language
==============
The default, if no C language dialect options are given, is
'-std=gnu11'.
2.2 C++ Language
================
The default, if no C++ language dialect options are given, is
'-std=gnu++14'.
gcc-Version 5.4.0
2.1 C Language
==============
The default, if no C language dialect options are given, is -std=gnu11
2.2 C++ Language
================
The default, if no C++ language dialect options are given, is -std=gnu++98
Zum Cder Standardmodus bleibt bestehen std=gnu11aber für C++ es ist abgesprungen std=gnu++98 zu std=gnu++14
Dies beantwortet die Frage.
– raj_gt1
20. Juni 2018 um 8:20 Uhr
Sieht so aus gnu17 für gcc 10.2
– Amum
6. Juni 2021 um 23:05 Uhr
Ciro Santilli OurBigBook.com
Minimales Testprogramm
Wenn Sie Lust haben, es empirisch herauszufinden, ohne irgendwelche Handbücher zu lesen.
__STDC_VERSION__: C99+ ANSI C-Makro, das für jede Version festgelegt wird. Nicht vorhanden in C89, wo es noch nicht durch den Standard definiert wurde.
Zur Erläuterung von -std=gnu* vs -std=c* siehe auch: Was sind die Unterschiede zwischen -std=c++11 und -std=gnu++11?
Was ist der Unterschied zwischen gnu17 und c17? Gibt es viel Unterschied?
– Ravi Raj
24. Juli 2020 um 10:59 Uhr
@Ravi Raj gnu* ist c* + alle GNU-Spracherweiterungen, es muss ein paar Dutzend davon geben, c* ist striktes ANSI, siehe auch: stackoverflow.com/questions/10613126/…
– Ciro Santilli OurBigBook.com
24. Juli 2020 um 12:26 Uhr
ablm
Die erste Zeile gibt Ihre GCC-Version (4.7.2) an.
(Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
Wenn Sie Ihren Code kompilieren, können Sie angeben, welche C/C++-Revision Sie verwenden möchten, indem Sie hinzufügen -std=c99 oder -std=c99 …
Notiz gnu89 wird standardmäßig verwendet.
Beachten Sie, dass die Option -std= für gcc nicht verwendet werden kann, um den Compiler in eine „Sandbox“ zu versetzen, damit er Konstrukte aus späteren Versionen von Standard-C nicht unterstützt. Dies gilt mit oder ohne -pedantic
Darauf können Sie sich nicht verlassen gcc -std=c89 -pedantic um Ihnen Fehler oder Warnungen zu geben, wenn Sie versuchen, mit einigen C99-Codekonstrukten zu kompilieren. In manchen Fällen geht das, in anderen nicht. Beispielsweise wird es problemlos Code kompilieren, der die verwendet %zu Formatbezeichner in einem Aufruf von printf(), obwohl er erst in C99 hinzugefügt wurde.
Für dieses spezielle Beispiel ist es weil printf ist eine Bibliotheksfunktion und technisch gesehen ist es dem Compiler egal. Obwohl viele Compiler eine Flusenprüfung für die Formatzeichenfolge haben, ist es nicht erforderlich, Probleme hier zu diagnostizieren.
– Zan Luchs
18. Juli 2020 um 5:04 Uhr
anton_rh
Ich habe einen Weg gefunden, die C++-Version abzufragen und für C angepasst:
gcc -dM -E -x c /dev/null | grep -F __STDC_VERSION__
Für dieses spezielle Beispiel ist es weil printf ist eine Bibliotheksfunktion und technisch gesehen ist es dem Compiler egal. Obwohl viele Compiler eine Flusenprüfung für die Formatzeichenfolge haben, ist es nicht erforderlich, Probleme hier zu diagnostizieren.
– Zan Luchs
18. Juli 2020 um 5:04 Uhr
Benutzer116480
Der Standard-gcc-Befehl ist der GNU-Dialekt von ISO C90 (einschließlich einiger C99-Funktionen). Dies ist die Standardeinstellung für C-Code.
14167200cookie-checkWas ist die standardmäßige C-std-Standardversion für den aktuellen GCC (insbesondere unter Ubuntu)?yes
C89 und C90 sind genau die gleiche Sprache. Der ANSI-C-Standard von 1989 und der ISO-C-Standard von 1990 unterscheiden sich nur in einigen (nicht normativen) Einführungsmaterialien und der Neunummerierung der Abschnitte. Die Standards C99 und C11 wurden ursprünglich von ISO veröffentlicht und dann von ANSI übernommen. (Der Begriff “ANSI C” bezieht sich immer noch eher auf C89/C90, obwohl offiziell C11 der aktuelle ANSI-Standard ist.)
– Keith Thompson
6. Februar 2013 um 19:35 Uhr