Подтвердить что ты не робот

Почему я не могу использовать ключевое слово auto в последней версии gcc

В последнее время я попытался использовать новые функции, поддерживаемые С++ 11, и я написал такой оператор, однако компилятор выполнил сбой.

auto x = 1;

ошибка отчета, указанная ниже:

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 ===|

Почему последняя версия gcc версии 4.7.0 на MinGW не поддерживает этот оператор. Но компилятор vs10 прошел. Может ли кто-нибудь узнать причину этой проблемы?

4b9b3361

Ответ 1

"GCC предоставляет экспериментальную поддержку стандарта ISO С++ 2011 года. Эта поддержка может быть включена с помощью параметров -std = С++ 11 или -std = gnu ++ 11, а первая отключает расширение GNU."

Это происходит отсюда: c + 11 поддержка

Ответ 2

Чтобы объяснить, на что компилятор действительно жалуется: auto используется как старое ключевое слово C, объявляя, что эта переменная имеет автоматическое хранилище. Эти ключевые слова имеют мало общего с системой типов, они указывают, как переменные представлены в памяти: где они хранятся (регистр процессора по сравнению с основной памятью/стекем) и как память исправлена. auto означает, что переменная хранится в стеке (хотя процессор может оптимизировать его в регистре процессора), и память автоматически восстанавливается, когда переменная выходит за пределы области действия - это правильный выбор практически в любой ситуации 1 и, таким образом, по умолчанию, поэтому практически никогда не использовалось это старое ключевое слово auto. Тем не менее, C++03 все еще обеспечивал обратную совместимость для кода, который имеет его; сегодня компиляторы все еще хотят поддерживать устаревший код.


1 Хотя часто вы хотите, чтобы объекты находились в куче, вы все равно будете обращаться к ним через переменные в стеке; У С++ есть свои собственные методы использования памяти, выделенной кучей (new, std::vector и т.д.), Вам не нужны небезопасные вещи C-style malloc.

Ответ 3

При компиляции вам нужно добавить командную строку -std=c++11 в g++.

Ответ 4

Это связано с тем, что функция не включена по умолчанию компилятором GCC. Если вы находитесь в Codeblocks, перейдите в "Настройки" → "Компилятор" и включите функцию, как показано - http://imgur.com/KrHx8nh

Ответ 5

Для добавления "-std = С++ 0x" к командной строке g++ исправлена ​​проблема.