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

时间:2012-12-25 19:10:51

标签: c++ c arrays multidimensional-array variable-length-array

当我尝试在global中声明C++二维数组时:

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

我收到一条说明error: variable-size type declared outside of any function

的错误消息

5 个答案:

答案 0 :(得分:8)

(乍一看,它看起来像是“C和C ++问题之间的区别”。虽然我可能会弄错。)

由于您使用非常量值作为数组大小,因此您尝试声明可变长度数组(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
};

答案 1 :(得分:2)

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

因此,这不起作用:

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

答案 2 :(得分:1)

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

对我来说很好。


注意

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


历史记录

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

答案 3 :(得分:0)

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

语法应该是

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

所以你可以做到以下几点;

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

答案 4 :(得分:0)

我建议使用std::vector

而不是C风格的数组
std::vector< std::vector<SDL_Rect> > mapX;