我有一个游戏的头文件,为棋盘声明了一个2d数组。
#ifndef GAME_H_
#define GAME_H_
static const int columns = 15;
static const int rows = 15;
int board[rows][columns];
#endif /* GAME_H_ */
我收到错误“error: variably modified 'board' at file scope
”。
答案 0 :(得分:7)
C不允许const
个变量作为数组边界。改为使用枚举:
enum { columns = 15, rows = 15 };
答案 1 :(得分:3)
该表达式是不允许的,它可以在C ++中使用,唯一的解决方法就是这样定义:
#ifndef GAME_H_
#define GAME_H_
#define COLUMNS 15
#define ROWS 15
int board[ROWS][COLUMNS];
#endif /* GAME_H_ */
答案 2 :(得分:2)
从C99开始,您可以声明所谓的可变长度数组(VLA),其中数组维度的大小是非常量表达式; IOW,你可以这样做:
int foo()
{
int x = 5;
int y = 10;
int values[x][y];
...
}
请注意,对于C99,此仅为true; C89和更早版本要求您对数组维使用编译时常量表达式。
VLA的问题在于,由于它们的工作原理,它们只能在块范围(即函数内的函数或复合语句中)声明;它们可能不会被声明为static
或extern
,并且它们可能不会在文件范围内声明(这是您的特定错误消息的来源)。
在这种特殊情况下,您需要使用编译时常量表达式(const
- 限定变量不):
#define COLUMNS 15
#define ROWS 15
extern int board[ROWS][COLUMNS];
请注意在数组声明中添加extern
关键字。您不希望头文件中的声明是数组的定义声明;相反,将定义声明放在实际实现游戏板的源文件中。否则,包含该标头的每个源文件都将尝试为board
创建自己的定义,并由链接器对其进行排序。
答案 3 :(得分:1)
int board[rows][columns];
无效C.您只能使用常量定义数组,而不能使用变量引用。即使变量引用引用的是常量值,行和列也是常量值的引用,而不是常量值本身。
有许多方法可以让您按照自己的意愿工作:
enum
的一部分,因为C编译器的枚举规则是在检测到类型不匹配时自动将它们转换为常量值。答案 4 :(得分:0)
查看以上链接是否可以帮助您解决问题。
答案 5 :(得分:0)
数组声明在编译之前需要一个常量值。您可以在其中定义变量或使用指针使其像数组一样工作。两种方式都很好,会给你相同的结果和简单。