Quais são as diferenças entre -std = c ++ 11 e -std = gnu ++ 11?

132

Quais são as diferenças entre -std=c++11e -std=gnu++11como parâmetro de compilação para gcc e clang? A mesma pergunta com c99e gnu99? Eu sei sobre os padrões C ++ e C, são as diferenças nos parâmetros que me interessam.

Li em algum lugar que isso tem a ver com algumas extensões, mas não está claro para mim quais e como escolher entre uma ou outra para um novo projeto.

Klaim
fonte
5
Os gnuqueridos se referem a extensões, e se você quiser escrever código portátil você deve furar a um extensões padrão e evitar completamente.
juanchopanza

Respostas:

91

Como você se descobriu, a diferença entre as duas opções é se as extensões GNU que violam / estendem o padrão C ++ estão ativadas ou não. As extensões GNU C ++ são descritas aqui . Você também pode usar a maioria das extensões GNU C (descritas aqui ) em seus programas C ++. Também seria útil ler sobre a -Wpedanticopção GCC aqui .

Observe que algumas extensões ainda podem estar em vigor quando usadas -std=c++11, desde que não contradigam o padrão. Por exemplo, ao usar o compilador MinGW, preciso das extensões para funcionar Boost.Lexical_Cast. Mas, desde que você não use nenhum deles, é melhor seguir o padrão sem extensões para garantir a portabilidade máxima. Isso pode ser útil se você for obrigado a alterar o compilador.

daramarak
fonte
4
Sim, evito extensões porque não recomendo fazer nada que não seja definido especificamente pelo Padrão ... mas mesmo assim, "viola" é um termo estranho e carregado, quando muitas dessas extensões são, para usar o Standardese , apenas definindo ou especificando coisas nas quais o Padrão não faz uso - ou talvez todas as extensões ... Você tem uma citação para qualquer extensão GNU que viole o Padrão, fazendo algo diferente de algo que o Padrão define explicitamente?
Underscore_d
9
Embora essa resposta seja boa, você deve editá-la para listar pelo menos as extensões ativadas, gnu11mas não ativadas c++11? A lista à qual você vinculou é de todas as extensões e, como você indica, algumas delas também estão ativadas c++11(como __restrict__).
einpoklum
O que descobri agora, e nunca concluí olhando a documentação dos sinalizadores, é o seguinte: -std = c ++ 11 reativa os trigramas -std = gnu ++ 11 os ignora e emite um aviso, como ele faz ao omitir -std alltogether
Daniel82 24/03