Ich arbeite auf einem Linux-Rechner. Gibt es einen Systembefehl, um den Standard zu finden, gefolgt von dem C-Compiler, den ich verwende?
Wie finde ich den Standard meines aktuellen Compilers, z. B. C90 usw
Hemanth
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.
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
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.
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
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