Jakie są różnice między parametrami kompilacji -std=c++11
i -std=gnu++11
jako parametrami gcc i clang? To samo pytanie z c99
i 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.
gnu
odnoszą się do rozszerzeń, a jeśli chcesz pisać przenośny kod, powinieneś trzymać się standardu i całkowicie unikać rozszerzeń.Odpowiedzi:
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
-Wpedantic
opcji 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 pracyBoost.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.źródło
gnu11
ale nie są dostępnec++11
? Lista, z którą łączysz się, zawiera wszystkie rozszerzenia, a jak sam wskazałeś, niektóre z nich są również włączonec++11
(lubię to__restrict__
).