Wie finde ich den Standard meines aktuellen Compilers, z. B. C90 usw

Lesezeit: 7 Minuten

Benutzeravatar von Hemanth
Hemanth

Ich arbeite auf einem Linux-Rechner. Gibt es einen Systembefehl, um den Standard zu finden, gefolgt von dem C-Compiler, den ich verwende?

Benutzeravatar von Tarantula
Tarantel

Dies ist Compiler-abhängig, ich nehme an, Sie verwenden GCC. Sie können Ihre vom Compiler definierten Makros überprüfen mit:

gcc -dM -E - < /dev/null

Überprüf den Handbuch über die Flaggenspeziell:

__STDC_VERSION__

Dieses Makro wird zur Versionsnummer des C-Standards erweitert, einer langen ganzzahligen Konstante der Form jjjjmmL, wobei jjjj und mm das Jahr und den Monat der Standardversion sind. Dies gibt an, welcher Version des C-Standards der Compiler entspricht. Wie STDCist dies nicht unbedingt für die gesamte Implementierung zutreffend, es sei denn, GNU CPP wird mit GCC verwendet.

Der Wert 199409L bezeichnet den C-Standard von 1989 in der geänderten Fassung von 1994, was der aktuelle Standard ist; der Wert 199901L bedeutet die Überarbeitung der C-Norm von 1999. Die Unterstützung für die Revision von 1999 ist noch nicht abgeschlossen.

Dieses Makro wird weder bei Verwendung der Option -traditional-cpp noch beim Kompilieren von C++ oder Objective-C definiert.

Im Diese Seite Sie können viele Informationen darüber finden. Siehe die vorhandene Tabelle hier.

Benutzeravatar von Flexo
Flexo

Sie können dies auch in Ihrem Code testen, indem Sie beispielsweise Standardmakros verwenden (ursprünglich aus dem gleichnamigen Sourceforge-Projekt):

#if defined(__STDC__)
# define PREDEF_STANDARD_C_1989
# if defined(__STDC_VERSION__)
#  define PREDEF_STANDARD_C_1990
#  if (__STDC_VERSION__ >= 199409L)
#   define PREDEF_STANDARD_C_1994
#  endif
#  if (__STDC_VERSION__ >= 199901L)
#   define PREDEF_STANDARD_C_1999
#  endif
#  if (__STDC_VERSION__ >= 201710L)
#   define PREDEF_STANDARD_C_2018
#  endif
# endif
#endif

Wenn Sie dies von der Befehlszeile aus überprüfen möchten, können Sie eine auswählen (z. B. c89) und den Rückgabewert von einem Minimalprogramm überprüfen:

echo -e "#ifdef __STDC__\n#error\n#endif"|gcc -xc -c - > /dev/null 2>&1; test $? -eq 0  || echo "c89

  • Sie könnten auch hinzufügen STDC_VERSION >= 201112L für die 2011 C-Norm.

    – m0j0

    21. September 2017 um 15:56 Uhr

  • Danke für den Hinweis und den Vorschlag

    – Flexo

    26. Oktober 2018 um 21:01 Uhr

  • Siehe Was ist das STDC_VERSION Wert für C11 ist auch nützlich.

    – chux – Wiedereinsetzung von Monica

    30. Januar 2019 um 15:14 Uhr

  • Mit gcc -std=c90 das Makro __STDC_VERSION__ ist nicht definiert. Wenn ich mich nicht irre, sind c89 und c90 der gleiche Standard … nicht wahr?

    – einpoklum

    29. Juni 2021 um 20:48 Uhr


Prüfen Sie zur Kompilierzeit mit dem Präprozessor-Makro:

  • __ANSI__
  • __STDC__
  • __STDC_VERSION__ >= 199901L für c99

  • Es wird nichts gerufen __ANSI__ in jeder Version der C-Sprache.

    – Ludin

    27. September 2019 um 8:32 Uhr

Benutzeravatar von Paul R
Paul R

Sie haben wahrscheinlich gcc, in diesem Fall können Sie den Standard zur Kompilierzeit angeben, z

$ gcc -Wall -std=c89 foo.c -o foo

oder:

$ gcc -Wall -std=c99 foo.c -o foo

Typ:

$ man gcc

für alle Details.

Benutzeravatar von RobK
RobK

Um die Version von C zu ermitteln, die Ihr Compiler von der Befehlszeile aus unterstützt, geben Sie einfach Folgendes ein:

gcc -dM -E - < /dev/null | grep "__STDC_"

Ersetzen Sie gcc durch den Compiler, den Sie überprüfen möchten.

Ob der Compiler C89 (auch ANSI C genannt) oder ISO C90 unterstützt, sehen Sie __STDC__ ist laut Standard mit 1 definiert. (Aber manchmal__STDC__ auf einen anderen Wert ungleich Null gesetzt ist). C89 ist identisch mit C90. C89 wurde von ANSI ratifiziert. Ein Jahr später ratifizierte die ISO den ANSI-Standard. Der ISO-Standard heißt C90.

Der ISO C90-Standard wurde geändert und wird informell C95 genannt. (Manchmal wird es auch C94 genannt. Aber C95 wird häufiger verwendet). Die ISO hat auch C99, C11 (2011) und C17 (2017) ratifiziert.

Wenn der Compiler C95 oder höher unterstützt, werden Sie sehen __STDC_VERSION__ definiert. Der Wert variiert je nach Version. (zB C99 wird haben __STDC_VERSION__ auf den Wert 199901L definiert). Sehen https://sourceforge.net/p/predef/wiki/Standards/

Wenn Sie die Version in Ihrem C-Programm überprüfen möchten, versuchen Sie diesen Code:

#include <stdio.h>
#include <math.h>       // Needed for INFINITY, HUGE_VAL, HUGE_VALF & HUGE_VALL
                        // constants (or macros)
#if !defined(__STDC__)
#   define __STDC__ 0
#endif

#if !defined(__STDC_VERSION__) 
#   define __STDC_VERSION__ 0
#endif


int main()
{
    if (!__STDC__ && !__STDC_VERSION__) printf("The C compiler does not comply with the C89 or later standard!\nIt likely complies with the 1978 K&R C standard (informally known as C78).\n");
    else if (__STDC_VERSION__ >= 201710L) printf("The C compiler complies with the C17 standard.\n");
    else if (__STDC_VERSION__ >= 201112L) printf("The C compiler complies with the C11 standard.\n");
    else if (__STDC_VERSION__ >= 199901L) printf("The C compiler complies with the C99 standard.\n");
    else if (__STDC_VERSION__ >= 199409L) printf("The C compiler complies with the amended C90 standard (also known as C95).\n");
    else if (__STDC__) printf("The C compiler complies with the ANSI C89 / ISO C90 standard.\n");
   
    puts("");
    if (__STDC__) printf("\"__STDC__\": %ld\n", __STDC_VERSION__);
    if (__STDC_VERSION__) printf("\"__STDC_VERSION__\": %ld\n\n", __STDC_VERSION__);
    
    puts("");
    if (__STDC_VERSION__ >= 199901L) printf(" INFINITY (added in C99): %f\n", INFINITY );    // Also works with %lf and %Lf
    if (__STDC_VERSION__ >= 199901L) printf("-INFINITY (added in C99): %f\n", -INFINITY );   // Also works with %lf and %Lf
    
    puts("");
    if (__STDC_VERSION__ >= 199901L) printf(" HUGE_VALF (added in C99): %f\n", HUGE_VALF );
    if (__STDC_VERSION__ >= 199901L) printf("-HUGE_VALF (added in C99): %f\n", -HUGE_VALF );
    
    puts("");
    if (__STDC__) printf(" HUGE_VAL (added in C89 (ANSI) which is the same as C90 (ISO)): %lf\n", HUGE_VAL );
    if (__STDC__) printf("-HUGE_VAL (added in C89 (ANSI) which is the same as C90 (ISO)): %lf\n", -HUGE_VAL );

    puts("");
    if (__STDC_VERSION__ >= 199901L) printf(" HUGE_VALL (added in C99): %Lf\n", HUGE_VALL );
    if (__STDC_VERSION__ >= 199901L) printf("-HUGE_VALL (added in C99): %Lf\n", -HUGE_VALL );

    return 0;
}

Unten ist die Ausgabe dieses Programms mit dem C-Compiler aus www.onlinegdb.com :

The C compiler complies with the C99 standard.

"__STDC__": 199901
"__STDC_VERSION__": 199901


 INFINITY (added in C99): inf
-INFINITY (added in C99): -inf

 HUGE_VALF (added in C99): inf
-HUGE_VALF (added in C99): -inf

 HUGE_VAL (added in C89 (ANSI) which is the same as C90 (ISO)): inf
-HUGE_VAL (added in C89 (ANSI) which is the same as C90 (ISO)): -inf

 HUGE_VALL (added in C99): inf
-HUGE_VALL (added in C99): -inf

Benutzeravatar von ciaron
ciaron

Wenn Ihr C-Compiler gcc ist, können Sie die -std Option zu angeben welcher C-Norm zu folgen ist. Der Standardwert ist gnu89. Es gibt keinen allgemeinen Systembefehl, um den Standard für einen bestimmten Compiler zu bestimmen. Sie müssen die Dokumentation überprüfen.

Ich glaube, die Antwort von Tarantula ist nicht genau richtig – da c89 und c90 der gleiche Standard sind (und zumindest von clang und gcc so behandelt werden) und nicht haben __STDC_VERSION__ definiert.

Also vielleicht sowas wie:

#if defined(__STDC__)
#  if defined(__STDC_VERSION__)
#    if (__STDC_VERSION__ >= 201710L)
#      define C_LANGUAGE_STANDARD 2018
#    elif (__STDC_VERSION__ >= 201112L)
#      define C_LANGUAGE_STANDARD 2011
#    elif (__STDC_VERSION__ >= 199901L)
#      define C_LANGUAGE_STANDARD 1999
#    elif (__STDC_VERSION__ >= 199409L)
#      define C_LANGUAGE_STANDARD 1995
#    endif
#  else
#      define C_LANGUAGE_STANDARD 1990
#  endif
#else
#      define C_LANGUAGE_STANDARD 1972
#endif

wäre passender?

  • Sie haben Recht. C89 und C90 sind der gleiche Standard. C89 wurde von ANSI ratifiziert. Und C90 wurde von ISO ratifiziert. Beide definieren nur __STDC__. Weder C89 noch C90 verwenden __STDC_VERSION__. Sehen sourceforge.net/p/predef/wiki/Standards

    – RobK

    9. August 2021 um 21:00 Uhr


  • PS Technisch hast du recht. Es gibt keinen C94- oder C95-Standard. Es gibt einen geänderten C90-Standard, der informell als C95 bekannt ist. Wenn der Compiler C95 entspricht, __STDC_VERSION__ wird auf 199409L gesetzt. Sehen sourceforge.net/p/predef/wiki/Standards. (Diese Website bezeichnet C95 als C94, was einige Leute tun. Aber C95 wird häufiger verwendet).

    – RobK

    10. August 2021 um 13:56 Uhr

  • @RobK: Und kompiliert jeder Compiler auf diese Weise?

    – einpoklum

    10. August 2021 um 15:16 Uhr

  • @einpoklim: Ja! Zwischen 1995 und 1999 gab es Compiler, die mit C95 kompilierten. Auch heute noch wird gcc nach dem C95-Standard kompiliert, wenn Sie die Option -std=iso9899:199409 verwenden. Sehen gcc.gnu.org/onlinedocs/gcc/Standards.html . Aber ich weiß nicht, warum man heute jemals C95 verwenden würde. C99 ist nur C95 mit großartigen zusätzlichen Funktionen. Ein C99-Compiler sollte also in der Lage sein, Code, der gemäß C95 geschrieben wurde, problemlos zu kompilieren.

    – RobK

    11. August 2021 um 16:50 Uhr


1397050cookie-checkWie finde ich den Standard meines aktuellen Compilers, z. B. C90 usw

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

Privacy policy