Was sind die Unterschiede zwischen -std = c ++ 11 und -std = gnu ++ 11?

132

Was sind die Unterschiede zwischen -std=c++11und -std=gnu++11als Kompilierungsparameter für gcc und clang? Gleiche Frage mit c99und gnu99? Ich kenne C ++ - und C-Standards, es sind die Unterschiede in den Parametern, die mich interessieren.

Ich habe irgendwo gelesen, dass es mit einigen Erweiterungen zu tun hat, aber mir ist nicht klar, welche und wie ich für ein neues Projekt zwischen der einen oder der anderen wählen soll.

Klaim
quelle
5
Die gnudiejenigen Erweiterungen beziehen, und wenn Sie portablen Code schreiben möchten , sollten Sie zu einem Standard und vermeiden Erweiterungen zusammen bleiben.
Juanchopanza

Antworten:

91

Wie Sie selbst herausgefunden haben, besteht der Unterschied zwischen den beiden Optionen darin, ob GNU-Erweiterungen, die den C ++ - Standard verletzen / erweitern, aktiviert sind oder nicht. Die GNU C ++ - Erweiterungen werden hier beschrieben . Sie können auch die meisten GNU C-Erweiterungen ( hier beschrieben ) in Ihren C ++ - Programmen verwenden. Es wäre auch sinnvoll sein , um die zu lesen -WpedanticGCC Option hier .

Beachten Sie, dass einige Erweiterungen bei der Verwendung weiterhin wirksam sein können -std=c++11, solange sie nicht dem Standard widersprechen. Wenn ich zum Beispiel den MinGW-Compiler verwende, brauche ich die Erweiterungen für eine Arbeit Boost.Lexical_Cast. Solange Sie jedoch keine verwenden, sollten Sie sich für maximale Portabilität besser an den Standard ohne Erweiterungen halten. Dies kann nützlich sein, wenn Sie gezwungen sind, den Compiler zu wechseln.

Daramarak
quelle
4
Ja, ich vermeide Erweiterungen, weil ich nicht empfehle, etwas zu tun, das nicht speziell durch den Standard definiert ist ... aber selbst dann ist "Verstöße" ein seltsamer und geladener Begriff, wenn viele dieser Erweiterungen Standardese verwenden , nur implementierungsdefinierende oder spezifizierende Dinge, über die der Standard schweigt - oder vielleicht sogar alle Erweiterungen ... Haben Sie ein Zitat für eine GNU-Erweiterung, die gegen den Standard verstößt, indem Sie etwas anderes tun als das, was der Standard explizit definiert?
underscore_d
9
Obwohl diese Antwort allgemein gut ist, würden Sie sie in Betracht ziehen, um zumindest die Erweiterungen aufzulisten, die aktiviert, gnu11aber nicht aktiviert sind c++11? Die Liste, mit der Sie verknüpft sind, enthält alle Erweiterungen, und wie Sie selbst angeben, sind einige von ihnen auch mit c++11(wie __restrict__) aktiviert .
Einpoklum
Was ich jetzt herausgefunden habe und niemals durch einen Blick auf die Dokumentation der Flags schließen würde, ist Folgendes: -std = c ++ 11 aktiviert Trigraphen wieder -std = gnu ++ 11 ignoriert sie und gibt eine Warnung wie diese aus tut, wenn -std insgesamt weggelassen wird
Daniel82