是否可以在C/C++中声明一个全局2D数组

Is it possible to declare a global 2D array in C/C++?

本文关键字:一个 全局 数组 2D 声明 C++ 是否      更新时间:2023-10-16

当我尝试在C++中声明global二维数组时,如下所示:

int maxX = 10;
int maxZ = 10;
SDL_Rect mapX[maxX][maxZ];

我得到一个错误,显示
error: variable-size type declared outside of any function

由于您使用非常数值作为数组大小,因此您正试图声明可变长度数组(VLA(。C++根本不支持VLA,而C只支持本地VLA。后者正是编译器在错误消息中告诉您的内容。(我相信这个错误消息来自C编译器,因为C++编译器会给你一个完全不同的错误。(

所以,严格地说,您不能在C或C++中声明这样的数组。虽然C语言支持VLA,但它们仍然必须是本地的。您不允许在C.中声明具有静态存储持续时间的VLA

在C++中,所有数组都必须具有固定的预先确定的编译时大小。这意味着数组大小必须由编译时常数指定。您使用了非常数值,这就是导致错误的原因。

换句话说,在C和C++中,当为具有静态存储持续时间的数组(包括所谓的"全局"数组(指定大小时,都需要使用常量表达式。

在C++中,为了使您的大小保持不变,您必须使用const 声明它们

const int maxX = 10;
const int maxZ = 10;

在C中,这是行不通的,因为在C中const对象并不是真正的常量,因为它们不会形成常量表达式。在C中,您必须使用任一

#define maxX 10
#define maxZ 10

enum {
  maxX = 10,
  maxZ = 10
};

在C++中,不能使用变量来定义数组的大小,因为编译器需要在编译时知道将数组的内存分配到哪里以及需要多少内存。将maxXmaxZ声明为int会使它们成为变量,因此不适用于数组维度。但是,如果您将它们声明为const int,那么它们将是contant,编译器将知道这些值将在程序的执行过程中被固定,并且它将允许使用它们来定义数组维度。

因此,这不起作用:

int maxX = 10;
int maxZ = 10;
SDL_Rect mapX[maxX][maxZ]; // Not allowed

但这很好:

const int maxX = 10;
const int maxZ = 10;
SDL_Rect mapX[maxX][maxZ]; // Allowed
static const int maxX = 10;
static const int maxZ = 10;
SDL_Rect mapX[maxX][maxZ];

对我来说很好。


备注

一般来说,使用全局、原始数组或全局原始数组都不是很好的做法。显然,我没有足够的背景来评论这是否是正确的选择。


历史记录

在现代constness之前,通常会枚举或#define常量,以使它们在这种情况下正确工作。

我认为这不是使用SDL_rect的正确方法。

语法应该像

SDL_Rect rect = {0,0,10,10}

因此,您可以执行以下操作;

int maxX = 10;
int maxZ = 10;
SDL_Rect rect = {0,0,maxX,maxZ}

我建议使用std::vector:而不是C样式的数组

std::vector< std::vector<SDL_Rect> > mapX;