Почему постоянный аргумент функции, используемый в качестве размера массива, дает ошибку? - PullRequest
2 голосов
/ 29 января 2012

Когда я использую постоянный аргумент функции в качестве размера массива в C ++, это выдает ошибку «Требуется постоянное выражение»:
enter image description here

Таким образом, компилятор не рассматривает m как постоянный объект, это означает, что я могу изменить значение m внутри функции, но когда я пытаюсь увеличить значение m, которое он дает, "не может изменить константный объект "ошибка:
enter image description here

Это действительно двусмысленно для меня. Может кто-нибудь объяснить, пожалуйста, что я делаю не так?

Ответы [ 4 ]

5 голосов
/ 29 января 2012

const на самом деле не означает «это значение является постоянным», но «вы не можете изменить это значение».

При этом должно быть понятно, почему последний код не компилируется, нобывший не может.Даже если вы зададите для него значение по умолчанию 5, это не гарантирует это пять, и поэтому у вас нет константы, поэтому вы не можете создать массив.Но тип по-прежнему const, поэтому вы не можете его изменить.

Тем не менее, начиная с C99, вы можете иметь массивы переменной длины, так что на самом деле все будет в порядке.(Это не хорошо в C ++.) Ваш компилятор кажется слишком старым, чтобы поддерживать C99.(Я настоятельно рекомендую использовать последнюю версию GCC.)

4 голосов
/ 29 января 2012

Вы не можете создавать статически массив переменного размера.Вот для чего malloc().Компилятор обрабатывает константы как переменные, даже если они объявлены как const, потому что он ничего не знает о них во время компиляции, поэтому он не может создать код во время компиляции для создания статического массива.

Более того:если вы объявляете m как const int m=5, с какой стати вы ожидаете, что он сможет увеличиваться?Это константа, поэтому вы не можете изменить ее значение.

Здесь нет ничего неоднозначного, вам просто нужно немного подумать об этом.

2 голосов
/ 02 февраля 2012

CodeBlocks - это редактор / IDE, а не компилятор. Я предполагаю, что он использует GCC для компилятора, который, я думаю, имеет расширение для использования массивов переменной длины C99 в C ++.

Это даже не в C ++ 11 (и, вероятно, никогда не будет в C ++, так как у нас std::vector), так что это один из очень немногих случаев, когда 20-летний компилятор действительно понял это правильно.

Если бы я был тобой, я бы все равно бросил TC ++. Он принадлежит музею.

0 голосов
/ 02 февраля 2012

Вам необходимо постоянное интегральное выражение времени компиляции . Не просто const.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...