Как задать размерность массива при помощи константы?
Пытаюсь создать массив, задав размерность константой, однако получаю ошибки: "выражение должно иметь константное значение", "требуется константное выражение", "невозможно выделить память для массива постоянного нулевого размера".
Код:
const int size = 10; // размерность массива
int a[size];
Задай с помощью defineа.
Размерность статического массива должна быть известна на этапе компиляции. А значение константы в общем случае может быть не извесно при компиляции. К сожалению в Си незавезли из плюсов constexpr.
SIZE большими буквами это исторически так сложилось дефайны называть капсом, само собой не обязательно, какой programming style будет принят у тебя в команде такой и используй
дефайны это не числа, это тупая подстановка строки, т.е. все что после define имя будет написано, то и подставится, так что аккуратно с ковычками скобками и прочим
Василий Банников, ааа, формально, если константой считать переменные с таким типом, то ее можно определить как extern и создать в другом .c файле (точнее объектном), т.е. на момент компиляции значение переменной будет не известно но ее тип const будет говорить компилятору что она не должна меняться (для соответствующих оптимизаций)
Василий Банников, Так что компилятор предполагает по умолчанию, что значение константы может быть измнено при следующей итерации выполнения данного участка кода. Поэтому и нельзя объявить статический массив с константным размером.
Василий Банников, В данном случае компилятору это все равно. О чем и свидетельствует ошибка компиляции.
Кстати, может быть код автора соберется, если установить более высокий уровень оптимизации и забить на соответствие стандарту. Но не факт. К тому же, писать код зависящий от опций компиляции, чаще всего плохая идея.
Как тут уже упоминали gcc пример автора соберет. Но это будет массив VLA, а не статический массив. А это уже совсем другая история.
Василий Банников, const - это просто обещание программиста не трогать вот эту вот переменную вот в этом вот скоупе. "обычная константа" - не настолько константна в C/С++, как вам хотелось бы думать.
Это расширение (называется VLA), но его поддерживают не все компиляторы.
Wataru, VLA -- это массив на стеке или параметр функции. В примере автора массив в сегменте данных. C99 прямо запрещает такое использование (с99 6.7.5.2:2):
Only an ordinary identifier (as defined in 6.2.3) with both block scope or function
prototype scope and no linkage shall have a variably modified type. If an identifier is
declared to be an object with static storage duration, it shall not have a variable length
array type.
ты свой массив может создать нужного размера уже в процессе выполнения а не на этапе компиляции, тогда размер может быть в переменной int *a=new int[size];
int *a это определение массива без инициализации, размер компилятору массива неизвестный, а саму инициализацию проводить оператор new а значит где то в конце нужно память освободить с помощью delete
upd. это было для c++
ну а для си получается надо пользоваться malloc и free соответственно int *a=(int*)malloc(size*sizeof(int));