2012-05-16 13 views
98

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

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

+5

Gli '' gnu' si riferiscono alle estensioni, e se si vuole scrivere codice portatile si dovrebbe attenersi ad uno standard ed evitare del tutto estensioni. – juanchopanza

risposta

66

Come hai scoperto tu stesso, la differenza tra le due opzioni è se le estensioni GNU che violano lo standard C++ siano abilitate o meno. Le estensioni GNU sono descritte here. Tieni presente che alcune estensioni possono essere ancora attive quando si utilizza -std=c++11, a condizione che non siano in contraddizione con lo standard.

Ad esempio, quando si utilizza il compilatore MinGW, ho bisogno delle estensioni per un funzionamento Boost.Lexical_Cast. Ma, finché non ne usi nessuno, è meglio attenersi allo standard senza estensioni per la massima portabilità. Questo potrebbe tornare utile se ti trovi costretto a cambiare compilatore.

+4

In molti casi le estensioni non violano lo standard –

+2

Sì, evito le estensioni perché non consiglio di fare nulla che non sia specificamente definito dallo Standard ... ma anche allora, "violare" è strano e carico termine, quando molte di queste estensioni sono, per usare Standardese, solo _implementation-defining_ o _specifying_ cose su cui lo Standard è silente - o forse anche tutte le estensioni ... Hai una citazione per qualsiasi estensione GNU che viola il Standard facendo qualcosa di diverso da una cosa che lo Standard definisce esplicitamente? –

+4

Sebbene questa risposta sia buona, si prenderà in considerazione la possibilità di modificarla in modo da elencare almeno le estensioni abilitate in 'gnu11' ma non in' C++ 11'? La lista a cui sei collegato è di tutte le estensioni, e come tu stesso indichi alcune sono abilitate anche con 'C++ 11' (come' __restrict__'). – einpoklum

Problemi correlati