Quali sono le differenze tra -std = c ++ 11 e -std = gnu ++ 11?


132

Quali sono le differenze tra -std=c++11e -std=gnu++11come parametro di compilazione per gcc e clang? Stessa domanda con c99e gnu99? Conosco gli standard C ++ e C, sono le differenze nei parametri che mi interessano.

Ho letto da qualche parte che ha a che fare con alcune estensioni, ma non mi è chiaro quali e come scegliere tra l'una o l'altra per un nuovo progetto.


5
Gli gnuquelli fanno riferimento alle estensioni, e se si vuole scrivere codice portabile si dovrebbe attenersi a un estensioni standard ed evitare del tutto.
juanchopanza,

Risposte:


91

Come hai scoperto tu stesso, la differenza tra le due opzioni è se le estensioni GNU che violano / estendono lo standard C ++ sono abilitate o meno. Le estensioni GNU C ++ sono descritte qui . Puoi anche usare la maggior parte delle estensioni GNU C (descritte qui ) nei tuoi programmi C ++. Sarebbe anche utile leggere qui-Wpedantic sull'opzione GCC .

Si noti che alcune estensioni possono essere ancora attive durante l'utilizzo -std=c++11, purché non contraddicano lo standard. Ad esempio, quando uso il compilatore MinGW, ho bisogno delle estensioni per funzionare Boost.Lexical_Cast. Ma, purché non ne utilizzi nessuno, è meglio attenersi allo standard senza estensioni per la massima portabilità. Questo potrebbe tornare utile se ti ritrovi costretto a cambiare compilatore.


4
Sì, evito le estensioni perché non consiglio di fare qualcosa che non sia definito in modo specifico dallo Standard ... ma anche in questo caso, "viola" è un termine strano e carico, quando molte di queste estensioni sono, per usare lo Standardese , semplicemente definendo l'implementazione o specificando cose su cui lo Standard tace - o forse anche tutte le estensioni ... Hai una citazione per qualsiasi estensione GNU che viola lo Standard facendo qualcosa di diverso da una cosa che lo Standard definisce esplicitamente?
underscore_d

9
Mentre questa risposta è buona in generale, considereresti di modificarla in modo da elencare almeno le estensioni che sono abilitate in gnu11ma non in c++11? L'elenco a cui sei collegato è di tutte le estensioni e, come tu stesso indichi, anche alcune di esse sono abilitate c++11(come __restrict__).
einpoklum,

Quello che ho scoperto ora, e che non avrei mai concluso guardando la documentazione delle bandiere, è il seguente: -std = c ++ 11 riattiva le trigrafi -std = gnu ++ 11 le ignora ed emette un avvertimento, simile fa quando si omette -std del tutto
Daniel82
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.