是否可以在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
由于您使用非常数值作为数组大小,因此您正试图声明可变长度数组(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++中,不能使用变量来定义数组的大小,因为编译器需要在编译时知道将数组的内存分配到哪里以及需要多少内存。将maxX
和maxZ
声明为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;
- C++:实现一个全局常量,其值由用户给出
- 我真的可以使用 Type 的每个声明创建一个全局变量吗?
- 在QT GUI中创建一个全局对象
- 为什么 std::get<T> for 'variant' 是一个全局函数?
- 通过其他文件中的另一个全局变量使用类的全局实例
- 定义一个全局变量并在那里初始化它本身可以吗?
- C++ pthread,两个线程读取一个全局变量
- 我应该为永远不变的值做一个全局常量变量吗,比如足球运动员的计数
- 如何打印地图?让它成为一个全局变量?C++
- 我如何定义一个全局函数来检查边界
- 如何定义一个全局可见操作符
- 将声明一个全局变量时,做递归内存效率和速度更快
- 创建一个全局ofstream变量
- 如何在c++中定义一个全局函数
- 如何为flashwindowwex创建一个全局32/64位钩子
- 我可以用函数调用的结果初始化一个全局变量吗
- 在 c++ 中声明一个全局范围变量 const
- 你能在.hpp文件中重载一个全局操作符吗?
- 在Python中公开一个C++全局变量
- 向静态库中添加一个全局变量以进行版本控制