Начиная с C99, вы можете объявить так называемый массив переменной длины (VLA), где размер измерения массива является непостоянным выражением; IOW, вы можете сделать это:
int foo()
{
int x = 5;
int y = 10;
int values[x][y];
...
}
Обратите внимание, что это только верно для C99; C89 и более ранние версии требуют использования константных выражений во время компиляции для измерения массива.
Проблема с VLA состоит в том, что из-за того, как они работают, они могут быть объявлены только в области видимости (то есть внутри функции или составного оператора в функции); они не могут быть объявлены как static
или extern
, и они не могут быть объявлены в области видимости файла (которая является источником вашего конкретного сообщения об ошибке).
В этом конкретном случае вам нужно будет использовать постоянные выражения времени компиляции (которые const
-качественные переменные не ):
#define COLUMNS 15
#define ROWS 15
extern int board[ROWS][COLUMNS];
Обратите внимание на добавление ключевого слова extern
в объявлении массива. Вы не хотите, чтобы объявление в заголовочном файле было объявлением , определяющим для массива; вместо этого поместите объявление , определяющее , в исходный файл, который фактически реализует игровую доску. В противном случае каждый исходный файл, включающий этот заголовок, попытается создать собственное определение для board
, и он будет решать компоновщику, чтобы разобраться во всем.