Was ist die standardmäßige C-std-Standardversion für den aktuellen GCC (insbesondere unter Ubuntu)?

Lesezeit: 8 Minuten

Benutzeravatar von ncmathsadist
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

Benutzeravatar von Keith Thompson
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 -pedantic
-std=c99 -pedantic
-std=c11 -pedantic

-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.

    – AJM

    5. Mai 2021 um 10:59 Uhr

  • @ChefGladiator Der Standard für GCC 9.4.0 (Ubuntu-Standard) ist gnu11. GCC 12.1.0 hat standardmäßig gnu17. (sehen gcc.gnu.org/onlinedocs/gcc-12.1.0/gcc/Standards.html#C-Language)

    – c21253

    14. Juli um 0:55


Benutzeravatar von Varun Garg
Varun Garg

nützliche Informationen aus info gcc für gcc6 und https://gcc.gnu.org/onlinedocs/gcc-5.4.0/gcc/Standards.html#Standards für gcc5

gcc-Version 6.3.110.1.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++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 Benutzeravatar von OurBigBook.com
Ciro Santilli OurBigBook.com

Minimales Testprogramm

Wenn Sie Lust haben, es empirisch herauszufinden, ohne irgendwelche Handbücher zu lesen.

cc

#include <stdio.h>

int main(void) {
#ifdef __STDC_VERSION__
    printf("__STDC_VERSION__ = %ld \n", __STDC_VERSION__);
#endif
#ifdef __STRICT_ANSI__
    puts("__STRICT_ANSI__");
#endif
    return 0;
}

Testen Sie mit:

#!/usr/bin/env bash
for std in c89 c99 c11 c17 gnu89 gnu99 gnu11 gnu17; do
  echo $std
  gcc -std=$std -o c.out c.c
  ./c.out
  echo
done
echo default
gcc -o c.out c.c
./c.out

Ergebnis:

c89
__STRICT_ANSI__

c99
__STDC_VERSION__ = 199901
__STRICT_ANSI__

c11
__STDC_VERSION__ = 201112
__STRICT_ANSI__

c17
__STDC_VERSION__ = 201710
__STRICT_ANSI__

gnu89

gnu99
__STDC_VERSION__ = 199901

gnu11
__STDC_VERSION__ = 201112

gnu17
__STDC_VERSION__ = 201710

default
__STDC_VERSION__ = 201710

Fazit: gnu17 wird standardmäßig verwendet:

Zur Erläuterung von -std=gnu* vs -std=c* siehe auch: Was sind die Unterschiede zwischen -std=c++11 und -std=gnu++11?

C++

main.cpp

#include <iostream>

int main(void) {
#ifdef __cplusplus
    std::cout << __cplusplus << std::endl;
#endif
#ifdef __STRICT_ANSI__
    std::cout << "__STRICT_ANSI__" << std::endl;
#endif
    return 0;
}

Testen Sie mit:

#!/usr/bin/env bash
for std in c++98 c++11 c++14 c++17 gnu++98 gnu++11 gnu++14 gnu++17; do
  echo $std
  g++ -std=$std -o cpp.out cpp.cpp
  ./cpp.out
  echo
done
echo default
g++ -o cpp.out cpp.cpp
./cpp.out

Ergebnis:

c++98
199711
__STRICT_ANSI__

c++11
201103
__STRICT_ANSI__

c++14
201402
__STRICT_ANSI__

c++17
201703
__STRICT_ANSI__

gnu++98
199711

gnu++11
201103

gnu++14
201402

gnu++17
201703

default
201402

Fazit: gnu++14 ist die Vorgabe:

  • __cplusplus: Makro, definiert durch den C++-Standard, einschließlich ab C++98

Getestet auf Ubuntu 18.10, GCC 8.2.0. GitHub-Upstream.

  • 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


Benutzeravatar von ablm
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

Benutzeravatar von anton_rh
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

Benutzeravatar von user116480
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.

1416720cookie-checkWas ist die standardmäßige C-std-Standardversion für den aktuellen GCC (insbesondere unter Ubuntu)?

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

Privacy policy