2012-05-16 13 views
98

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

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 dla nowego projektu.

+5

Te "gnu" odnoszą się do rozszerzeń, a jeśli chcesz pisać w przenośnym kodzie, powinieneś trzymać się standardu i całkowicie unikać rozszerzeń. – juanchopanza

Odpowiedz

66

Jak się dowiedziałeś, różnica między tymi dwiema opcjami jest taka, czy rozszerzenia GNU, które naruszają standard C++, są włączone, czy nie. Rozszerzenia GNU są opisane here. Zauważ, że niektóre rozszerzenia mogą nadal działać, jeśli używasz -std=c++11, o ile nie są one sprzeczne ze standardem.

Na przykład, podczas korzystania z kompilatora MinGW, potrzebuję rozszerzeń do pracy Boost.Lexical_Cast. Ale dopóki nie używasz żadnego z nich, lepiej trzymać się standardu bez rozszerzeń, aby uzyskać maksymalną przenośność. Może się to przydać, jeśli będziesz zmuszony zmienić kompilator.

+4

W wielu przypadkach rozszerzenia nie naruszają standardu –

+2

Tak, unikam rozszerzeń, ponieważ nie polecam robić niczego, co nie jest zdefiniowane przez Standard ... ale nawet wtedy "naruszenie" jest dziwne i załadowane termin, gdy wiele z tych rozszerzeń ma używać Standardese, właśnie _implementacja-definiowanie_ lub _specyficzne_ rzeczy, o których Standard milczy - a może nawet wszystkie rozszerzenia ... Czy masz cytat dla dowolnego rozszerzenia GNU, które narusza Standardowo robiąc coś innego niż coś, co Standard wyraźnie definiuje? –

+4

Podczas gdy ta odpowiedź jest dobra ogólna, czy rozważałbyś jej edycję tak, aby przynajmniej wyświetlała rozszerzenia, które są włączone w 'gnu11', ale nie w' C++ 11'? Lista, z którą się łączysz jest ze wszystkich rozszerzeń i jak sam wskazywałeś, niektóre z nich są również włączone z 'C++ 11' (jak' __restrict__'). – einpoklum

Powiązane problemy