2012-04-08 7 views
19

Wszystko, ostatnio próbowałem użyć nowych funkcji obsługiwanych przez C++ 11, i napisałem takie oświadczenie, jednak kompilator nie działa.dlaczego nie mogę użyć słowa kluczowego auto w ostatniej wersji gcc

auto x = 1; 

błąd raport wymienione poniżej:

D:\DEV\CBCppTest\main.cpp||In function 'int main()':| 
D:\DEV\CBCppTest\main.cpp|22|warning: 'auto' changes meaning in C++11; please remove it [-Wc++0x-compat]| 
D:\DEV\CBCppTest\main.cpp|22|error: 'x' does not name a type| 
||=== Build finished: 1 errors, 1 warnings ===| 

Dlaczego ostatni gcc w wersji 4.7.0 na MinGW nie może poprzeć to stwierdzenie. Ale kompilator vs10 minął. Czy ktoś może znać przyczynę tego problemu?

Odpowiedz

29

"GCC zapewnia eksperymentalne wsparcie dla standardu ISO C++ w 2011 r. Wsparcie to można włączyć za pomocą opcji kompilatora -std = C++ 11 lub -std = gnu ++ 11, a poprzednie wyłącza rozszerzenie GNU."

Pochodzi stąd: c+11 support

+0

dzięki, to zastanawia mnie przez długi czas. –

5

Po kompilacji trzeba dodać -std=c++11 do g ++ wiersza poleceń.

2

Wynika to z faktu, że funkcja nie jest domyślnie włączona przez kompilator GCC. Jeśli korzystasz z Blokady kodu, przejdź do Ustawienia -> Kompilator i włącz funkcję, jak pokazano - http://imgur.com/KrHx8nh

7

Aby wyjaśnić, na co kompilator faktycznie narzeka: auto był starym słowem kluczowym C, deklarującym, że ta zmienna ma automatyczne przechowywanie. Te słowa kluczowe mają niewiele wspólnego z systemem typów, określają, w jaki sposób zmienne są reprezentowane w pamięci: gdzie są przechowywane (rejestr procesorów w stosunku do głównej pamięci/stosu) i jak odzyskiwana jest pamięć. auto oznacza, że ​​zmienna jest przechowywana na stosie (chociaż procesor może zoptymalizować ją do rejestru procesora), a pamięć jest automatycznie odzyskiwana , gdy zmienna wykracza poza zakres - co jest właściwym wyborem w prawie każdej sytuacji dlatego domyślnie, więc praktycznie nikt nigdy nie użył tego starego słowa kluczowego auto. Jednak C++03 nadal zapewnia kompatybilność wsteczną dla kodu, który ją ma; dzisiejsze kompilatory nadal chcą wspierać starszy kod.


Choć często chcesz obiekty do przebywania na stercie, będziesz nadal uzyskiwać dostęp do tych poprzez zmienne na stosie; C++ ma swoje własne metody korzystania z pamięci przydzielanej stertom (new, std::vector itp.), Nie potrzebujesz niebezpiecznych rzeczy w stylu C malloc.

1

Dla mnie dodanie "-std = C++ 0x„do" g ++ wiersza poleceń naprawili problem.

Powiązane problemy