Russian Qt Forum

Программирование => С/C++ => Тема начата: romsuhov от Декабрь 11, 2011, 23:01



Название: Объявление массива переменной
Отправлено: romsuhov от Декабрь 11, 2011, 23:01
Здравствуйте!
Возникла такая ситуация. Я всегда думал, что в C++ объявлять массив переменной запрещено, то есть такой код
Код:
int b;
cin>>b;
int m[b];
компилироваться не будет.
В компиляторе Visual C++ он и не компилируется, ругаясь на то, что размер массива - не константа.
Но когда я компилирую этот код в g++, он нормально компилируется.
Я ни у кого толком не смог выяснить, допустимо это в С++ и почему так происходит.
Всё, что мне удалось узнать, это то, что в Си, стандарт С99 инициализация массива переменной разрешена.
B g++ я даже явно указывал язык, т.е.
Код:
g++ -x c++ filename.cpp
Собственно, хотел спросить, что вы думаете по этому поводу, надеюсь, кто-нибудь сможет всё объяснить.


Название: Re: Объявление массива переменной
Отправлено: BRE от Декабрь 11, 2011, 23:29
Это расширение gcc. Сейчас, вроде, это уже в новом стандарте (в драфте вроде было точно).



Название: Re: Объявление массива переменной
Отправлено: pastor от Декабрь 12, 2011, 02:32
Да, такая возможность в C++11 есть. См. ключевое слово "constexpr". Оно позволяет использовать в подобных выражения не только переменные, но и функции. Но есть ряд ограничений, советую ознакомиться с ними


Название: Re: Объявление массива переменной
Отправлено: Пантер от Декабрь 12, 2011, 07:46
А лучше использовать std::vector.


Название: Re: Объявление массива переменной
Отправлено: romsuhov от Декабрь 12, 2011, 18:10
BRE
Спасибо!
pastor
Да, про constexpr я слышал, но толком ещё не разбирался с ним и прочими штуками нового стандарта.
Пантер
Ну это-то да, просто всё таки хотел разобраться :)


Название: Re: Объявление массива переменной
Отправлено: Tonal от Декабрь 21, 2011, 10:14
Да, такая возможность в C++11 есть. См. ключевое слово "constexpr". Оно позволяет использовать в подобных выражения не только переменные, но и функции. Но есть ряд ограничений, советую ознакомиться с ними
Не, constexpr подставлять значения вычисленные на этапе компиляции.
А в обсуждаемом случае значение переменной известно только на этапе выполнения.
Это довольно старое расширение gcc сделанное через неявный вызов alloca.
Но вот в С++11 оно мне не попадалось - может проглядел. :)


Название: Re: Объявление массива переменной
Отправлено: pastor от Декабрь 21, 2011, 16:59
Да, Tonal,  ты прав. Память подвела меня.

Цитировать
C++11 introduced the keyword constexpr, which allows the user to guarantee that a function or object constructor is a compile-time constant.