使用常量声明二维数组的C语言代码

3
我有一个游戏的头文件,声明了一个用于棋盘的二维数组。
#ifndef GAME_H_
#define GAME_H_

static const int columns = 15;
static const int rows = 15;

int board[rows][columns];

#endif /* GAME_H_ */

我遇到了一个错误:
错误:文件范围内的可变修改的“board”

可能是重复的问题:C语言中在文件作用域下使用可变长度数组 - Peter Mortensen
这个回答解决了你的问题吗?C语言中在文件作用域下的可变大小数组 - Toby Speight
6个回答

9

C语言不允许使用const变量作为数组的边界。可以使用枚举代替:

enum { columns = 15, rows = 15 };

3

该表达式不被允许,在C++中可以使用,唯一的解决方法是像这样定义它:

#ifndef GAME_H_
#define GAME_H_

#define COLUMNS 15
#define ROWS 15

int board[ROWS][COLUMNS];

#endif /* GAME_H_ */

3

C99版本开始,您可以声明所谓的变长数组(VLA),其中数组维度的大小是非常量表达式。也就是说,您可以这样做:

int foo()
{
  int x = 5;
  int y = 10;
  int values[x][y];
  ...
}

请注意,这仅适用于C99;C89及更早版本需要使用编译时常量表达式来定义数组维度。
可变长度数组的问题在于,由于其工作方式,它们只能在块作用域(即函数或函数中的复合语句内)声明;它们不能声明为静态或外部的,并且不能在文件作用域声明(这是您特定错误消息的来源)。
在这种特定情况下,您需要使用编译时常量表达式(const限定的变量不是)。
#define COLUMNS 15
#define ROWS    15

extern int board[ROWS][COLUMNS];

请注意,在数组声明中添加了extern关键字。您不希望头文件中的声明成为数组的定义声明;相反,请将定义声明放在实际实现游戏板的源文件中。否则,包含该头文件的每个源文件都将尝试创建自己的board定义,并且需要链接器来解决所有问题。

2
int board[rows][columns];

这不是有效的C语言。您只能使用常量定义数组,而不能使用变量引用。即使变量引用指向一个常量值,行和列也是对常量值的引用,而不是常量值本身。

有几种方法可以使其按照您的意愿工作:

  1. 您可以在预处理器中定义“变量”,以便它们在编译之前被展开为常量。
  2. 您可以将值定义为枚举enum的一部分,因为C编译器的规则是在检测到类型不匹配时自动将它们转换为它们的常量值。

0

数组声明在编译前需要一个常量值。您可以在其中使用#define变量或使用指针使其像数组一样工作。这两种方式都可以获得相同的结果和简洁性。


这并不能解释为什么在C++中它能够正常工作。 - Peter Mortensen
或者使用指针使其像数组一样工作。不,你不能。指针不是数组,数组也不是指针。 - Andrew Henle

0

试试这个

看看上面的链接是否对你有所帮助。


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Dennis Meng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接