我有一个游戏的头文件,它为棋盘声明了一个二维数组。
#ifndef GAME_H_#define GAME_H_static const int columns = 15;static const int rows = 15;int board[rows][columns];#endif /* GAME_H_ */
#ifndef GAME_H_
#define GAME_H_
static const int columns = 15;
static const int rows = 15;
int board[rows][columns];
#endif /* GAME_H_ */
字符串我得到一个错误:错误:可变修改'板'在文件范围
jtoj6r0c1#
C不允许const变量作为数组边界。使用枚举代替:
const
enum { columns = 15, rows = 15 };
字符串
guykilcj2#
这个表达式是不允许的,它可以在C++中使用,唯一的方法是这样定义它:
#ifndef GAME_H_#define GAME_H_#define COLUMNS 15#define ROWS 15int board[ROWS][COLUMNS];#endif /* GAME_H_ */
#define COLUMNS 15
#define ROWS 15
int board[ROWS][COLUMNS];
vbopmzt13#
从C99开始,可以声明一个 * 可变长度数组 *(VLA),其中数组维度的大小是一个非常量表达式; IOW,你可以这样做:
int foo(){ int x = 5; int y = 10; int values[x][y]; ...}
int foo()
{
int x = 5;
int y = 10;
int values[x][y];
...
}
字符串请注意,这 * 仅 * 对C99为真; C89和更早版本要求您对数组维度使用编译时常量表达式。VLA的问题在于,由于它们的工作方式,它们只能在 * 块范围 *(即,在函数或函数中的复合语句中)声明;它们不能被声明为static或extern,也不能在文件范围内声明(这是特定错误消息的来源)。在这种特殊情况下,你需要使用编译时常量表达式(其中const限定的变量是 not):
static
extern
#define COLUMNS 15#define ROWS 15extern int board[ROWS][COLUMNS];
extern int board[ROWS][COLUMNS];
型注意在数组声明中添加了extern关键字。您不希望头文件中的声明是数组的 defining 声明;相反,将 defining 声明放在实际实现游戏板的源文件中。否则,包含该头文件的每个源文件都将尝试为board创建自己的定义,这将由链接器来解决。
board
5cg8jx4n4#
字符串C是无效的。只能用常量定义数组,而不能用变量引用定义数组。即使变量引用引用的值是常量,行和列也是对常量值的引用,而不是常量值本身。有很多方法可以让它按照你想要的方式工作:1.您可以在预处理器中定义“变量”,以便在编译时之前将它们展平为常量。1.您可以将这些值定义为枚举enum的一部分,因为C编译器的枚举规则是在检测到类型不匹配时自动将它们转换为常量值。
enum
hpxqektj5#
数组声明在编译前需要一个常数值。你可以在其中#定义变量,或者使用指针使它像数组一样工作。这两种方法都很好,会给予你同样的结果和简单。
5条答案
按热度按时间jtoj6r0c1#
C不允许
const
变量作为数组边界。使用枚举代替:字符串
guykilcj2#
这个表达式是不允许的,它可以在C++中使用,唯一的方法是这样定义它:
字符串
vbopmzt13#
从C99开始,可以声明一个 * 可变长度数组 *(VLA),其中数组维度的大小是一个非常量表达式; IOW,你可以这样做:
字符串
请注意,这 * 仅 * 对C99为真; C89和更早版本要求您对数组维度使用编译时常量表达式。
VLA的问题在于,由于它们的工作方式,它们只能在 * 块范围 *(即,在函数或函数中的复合语句中)声明;它们不能被声明为
static
或extern
,也不能在文件范围内声明(这是特定错误消息的来源)。在这种特殊情况下,你需要使用编译时常量表达式(其中
const
限定的变量是 not):型
注意在数组声明中添加了
extern
关键字。您不希望头文件中的声明是数组的 defining 声明;相反,将 defining 声明放在实际实现游戏板的源文件中。否则,包含该头文件的每个源文件都将尝试为board
创建自己的定义,这将由链接器来解决。5cg8jx4n4#
字符串
C是无效的。只能用常量定义数组,而不能用变量引用定义数组。即使变量引用引用的值是常量,行和列也是对常量值的引用,而不是常量值本身。
有很多方法可以让它按照你想要的方式工作:
1.您可以在预处理器中定义“变量”,以便在编译时之前将它们展平为常量。
1.您可以将这些值定义为枚举
enum
的一部分,因为C编译器的枚举规则是在检测到类型不匹配时自动将它们转换为常量值。hpxqektj5#
数组声明在编译前需要一个常数值。你可以在其中#定义变量,或者使用指针使它像数组一样工作。这两种方法都很好,会给予你同样的结果和简单。