Erzwingt Compiler nach C99-Standard

7

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:

kling 5

%Vor%

gcc 4.1

%Vor%

gcc 4.7

%Vor%

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ß?

    
grasbueschel 09.03.2014, 16:51
quelle

2 Antworten

15

-std=c99 deaktiviert keine Spracherweiterungen (GNU C hat anon-Strukturen in C99).

Die -pedantic (oder -pedantic-errors ) Flags lassen den Compiler bei Spracherweiterungen warnen.

    
MBlanc 09.03.2014, 17:13
quelle
8

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 :

sehen
  

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 .

    
Shafik Yaghmour 09.03.2014 17:44
quelle

Tags und Links