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