Определения целочисленных массивов: длина

Я определяю переменную как целое число и хочу ее использовать

int specLength = 17;
int spec[specLength-1];

Когда я это делаю, я получаю следующее сообщение об ошибке:

 TestProgram:34: error: array bound is not an integer constant before  ']' token
 int spec[specLength-1];

Но когда я настроил его как

int specLength = 17;
int spec[16];

все работает нормально.

В чем тут волшебство?

Большое спасибо

, 👍0


1 ответ


Лучший ответ:

1

Вам необходимо использовать постоянное выражение, которое всегда возвращает одно и то же значение.

const int specLength = 17;
int spec[specLength - 1];

В противном случае компилятор не будет знать, сколько места зарезервировано для массива.

Проблема с C/C++ в том, что компилятор на самом деле не знает, была ли переменная где-то изменена или нет (например, через указатели ). Вам нужно сообщить компилятору, что что-то статично, не меняется.

Вы также можете использовать #define для того же самого porpuse:

#define SPEC_LENGTH 17
int spec[SPEC_LENGTH]

Почему оба? const int val=17 означает, что val имеет тип (int). Использование #define — это просто поиск и замена текста перед компиляцией. Так что SPEC_LENGTH вообще не имеет типа. При необходимости вам придется использовать приведение, например (int) SPEC_LENGTH.

,