繁体   English   中英

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

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

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

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

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

(乍一看,它看起来像是“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
};

在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
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}

而不是C风格的数组,我建议使用std::vector

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM