Jakie są różnice między -std = c ++ 11 a -std = gnu ++ 11?

132

Jakie są różnice między parametrami kompilacji -std=c++11i -std=gnu++11jako parametrami gcc i clang? To samo pytanie z c99i gnu99? Wiem o standardach C ++ i C, interesują mnie różnice w parametrach.

Czytałem gdzieś, że ma to związek z niektórymi rozszerzeniami, ale nie jest dla mnie jasne, które z nich i jak wybrać między jednym a drugim w nowym projekcie.

Klaim
źródło
5
Te gnuodnoszą się do rozszerzeń, a jeśli chcesz pisać przenośny kod, powinieneś trzymać się standardu i całkowicie unikać rozszerzeń.
juanchopanza

Odpowiedzi:

91

Jak sam się przekonałeś, różnica między tymi dwiema opcjami polega na tym, czy rozszerzenia GNU, które naruszają / rozszerzają standard C ++, są włączone, czy nie. Rozszerzenia GNU C ++ są opisane tutaj . Możesz także używać większości rozszerzeń GNU C (opisanych tutaj ) w swoich programach C ++. Byłoby również przydatne, by przeczytać o -Wpedanticopcji GCC tutaj .

Zauważ, że niektóre rozszerzenia mogą nadal obowiązywać podczas używania -std=c++11, o ile nie są sprzeczne ze standardem. Na przykład, gdy używam kompilatora MinGW, potrzebuję rozszerzeń do pracy Boost.Lexical_Cast. Ale jeśli nie używasz żadnego z nich, lepiej trzymać się standardu bez rozszerzeń, aby zapewnić maksymalną przenośność. Może się to przydać, jeśli zostaniesz zmuszony do zmiany kompilatora.

daramarak
źródło
4
Tak, unikam rozszerzeń, ponieważ nie polecam robienia czegokolwiek, co nie jest wyraźnie zdefiniowane w standardzie ... ale nawet wtedy „narusza” to dziwny i załadowany termin, gdy jest wiele z tych rozszerzeń, aby używać Standardese , po prostu definiując implementację lub określając rzeczy, na temat których Standard milczy - a może nawet wszystkie rozszerzenia ... Czy masz cytat dla jakiegokolwiek rozszerzenia GNU, które narusza Standard, robiąc coś innego niż to, co Standard wyraźnie definiuje?
underscore_d
9
Chociaż ta odpowiedź jest dobra, ogólna, czy rozważyłbyś jej edycję, tak aby przynajmniej wyszczególnić rozszerzenia, które są włączone, gnu11ale nie są dostępne c++11? Lista, z którą łączysz się, zawiera wszystkie rozszerzenia, a jak sam wskazałeś, niektóre z nich są również włączone c++11(lubię to __restrict__).
einpoklum
To, czego się teraz dowiedziałem i nigdy nie zakończyłbym, patrząc na dokumentację flag, jest następujące: -std = c ++ 11 ponownie włącza trygrafy -std = gnu ++ 11 ignoruje je i emituje ostrzeżenie, takie jak to robi, gdy pominie się -std alltap
Daniel82