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

hzbexzde  于 2023-08-03  发布在  其他
关注(0)|答案(5)|浏览(136)

我有一个游戏的头文件,它为棋盘声明了一个二维数组。

  1. #ifndef GAME_H_
  2. #define GAME_H_
  3. static const int columns = 15;
  4. static const int rows = 15;
  5. int board[rows][columns];
  6. #endif /* GAME_H_ */

字符串
我得到一个错误:
错误:可变修改'板'在文件范围

jtoj6r0c

jtoj6r0c1#

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

  1. enum { columns = 15, rows = 15 };

字符串

guykilcj

guykilcj2#

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

  1. #ifndef GAME_H_
  2. #define GAME_H_
  3. #define COLUMNS 15
  4. #define ROWS 15
  5. int board[ROWS][COLUMNS];
  6. #endif /* GAME_H_ */

字符串

vbopmzt1

vbopmzt13#

从C99开始,可以声明一个 * 可变长度数组 *(VLA),其中数组维度的大小是一个非常量表达式; IOW,你可以这样做:

  1. int foo()
  2. {
  3. int x = 5;
  4. int y = 10;
  5. int values[x][y];
  6. ...
  7. }

字符串
请注意,这 * 仅 * 对C99为真; C89和更早版本要求您对数组维度使用编译时常量表达式。
VLA的问题在于,由于它们的工作方式,它们只能在 * 块范围 *(即,在函数或函数中的复合语句中)声明;它们不能被声明为staticextern,也不能在文件范围内声明(这是特定错误消息的来源)。
在这种特殊情况下,你需要使用编译时常量表达式(其中const限定的变量是 not):

  1. #define COLUMNS 15
  2. #define ROWS 15
  3. extern int board[ROWS][COLUMNS];


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

展开查看全部
5cg8jx4n

5cg8jx4n4#

  1. int board[rows][columns];

字符串
C是无效的。只能用常量定义数组,而不能用变量引用定义数组。即使变量引用引用的值是常量,行和列也是对常量值的引用,而不是常量值本身。
有很多方法可以让它按照你想要的方式工作:
1.您可以在预处理器中定义“变量”,以便在编译时之前将它们展平为常量。
1.您可以将这些值定义为枚举enum的一部分,因为C编译器的枚举规则是在检测到类型不匹配时自动将它们转换为常量值。

hpxqektj

hpxqektj5#

数组声明在编译前需要一个常数值。你可以在其中#定义变量,或者使用指针使它像数组一样工作。这两种方法都很好,会给予你同样的结果和简单。

相关问题