Ich habe an meinem Projekt gearbeitet, als ich entdeckte, dass die anonymen Strukturen, die ich eine Weile benutzt habe, eigentlich nur in C11 verfügbar sind, nicht in C99, dem Standard, gegen den ich kodieren möchte.
Gegeben folgender Code:
%Vor%Dieser Code sollte nur in C11 kompiliert werden (oder wenn Compiler-Erweiterungen diese Funktion bereitstellen und aktiviert sind). Sehen wir uns die Ergebnisse verschiedener Compiler an:
Ich habe immer versucht, den Compiler in den C99-Modus zu zwingen, indem ich -std=c99
angegeben habe, aber offensichtlich funktioniert das nicht (außer für gcc 4.1, das ohne den Parameter -std kompiliert wird).
Also meine Frage ist jetzt, wie kann ich die Compiler GCC und Clang, in jeder Version, einen Fehler zu erzeugen, wenn ich Code, der nicht mit dem Standard ich spezifiziere mit -std
? Gibt es ein Befehlszeilenargument, von dem ich nichts weiß?
-std=c99
deaktiviert keine Spracherweiterungen (GNU C hat anon-Strukturen in C99).
Die -pedantic
(oder -pedantic-errors
) Flags lassen den Compiler bei Spracherweiterungen warnen.
Sowohl gcc
als auch clang
erlauben eine große Anzahl von Erweiterungen und hier für clang . clang
versucht im Allgemeinen, die meisten Erweiterungen zu unterstützen, die gcc
ausführt. Beide erlauben sogar die Verwendung von Features, die C nur in C ++ sind, zum Beispiel VLAs, die eine C99-Funktion sind .
In diesem Fall können Sie beide unbenannte struct / union-Felder in structs / unions in C99 Modus, obwohl es eine C11 Funktion ist.
Die Sprachstandards, die von GCC unterstützt werden, dokumentieren gut, welche Flags erforderlich sind, um diese zu Warnungen zu machen und Fehler und so weit ich weiß clang
folgt den gleichen Konventionen:
[...] Um alle vom Standard geforderten Diagnosen zu erhalten, sollten Sie -pedantic (oder -pedantic-errors) angeben, wenn Sie Fehler und keine Warnungen wünschen. [...]
So wird -pedantic
Sie warnen, wenn Sie eine Erweiterung verwenden und -pedantic-errors
wird diese Warnungen zu einem Fehler machen. Mit -pedantic
flag sollten Sie eine Warnung wie diese in gcc
:
Warnung: ISO C99 unterstützt keine unbenannten Strukturen / Unionen [-Wpedantic]
und das in clang
( live sehen ):
Warnung: anonyme Strukturen sind eine C11-Erweiterung [-Wc11-Erweiterungen]
und es wird zu einem Fehler mit -pedantic-errors
.