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

Sha*_*ura 2 c c++ arrays multidimensional-array variable-length-array

当我尝试像这样声明一个global二维数组C++:

int maxX = 10;
int maxZ = 10;
SDL_Rect mapX[maxX][maxZ];
Run Code Online (Sandbox Code Playgroud)

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

AnT*_*AnT 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;
Run Code Online (Sandbox Code Playgroud)

在C中,这将不起作用,因为在C语言中,const对象在某种意义上并不是真正的常量,它们不会形成常量表达式.在C中你必须使用其中之一

#define maxX 10
#define maxZ 10
Run Code Online (Sandbox Code Playgroud)

要么

enum {
  maxX = 10,
  maxZ = 10
};
Run Code Online (Sandbox Code Playgroud)