【问题标题】:Is it possible to declare a global 2D array in C/C++?是否可以在 C/C++ 中声明全局二维数组?
【发布时间】:2012-12-11 13:57:43
【问题描述】:

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

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

我收到一条错误消息
error: variable-size type declared outside of any function

【问题讨论】:

  • 使 maxX 和 maxZ 保持不变,即 const int maxX = 10;
  • 不要在 C++ 中使用原始数组,使用std::vector。在这种情况下,一个向量的向量。
  • 为什么它被标记为[C]?这是关于 C 和 C++ 之间区别的问题吗?还是只是标记不正确?

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


【解决方案1】:

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

语法应该是这样的

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

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

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

【讨论】:

  • 我不认为 OP 正在尝试创建 single SDL_Rect.
【解决方案2】:
static const int maxX = 10;
static const int maxZ = 10;
SDL_Rect mapX[maxX][maxZ];

对我来说很好。


注意

一般来说,使用全局变量、原始数组或全局原始数组都不是好习惯。显然我没有足够的上下文来评论这是否是正确的选择。


历史记录

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

【讨论】:

  • 首先,严格来说,在 C++ 中const 对象总是在这个上下文中工作,而在 C 中他们从不在这个上下文中工作并且还是没有。出于这个原因,我不明白你的“现代常量之前”的话。这里没有时间上的分离。与“之前”相比并没有真正改变。 (除非您将 C++ 视为 C 的现代继承者和替代品。我个人不这么认为。)
  • 其次,您的代码仅在 C++ 中“工作正常”,但 static 部分是多余的。在 C++ 中,const 对象默认具有静态链接。在 C 中,static 部分有所不同,但您的声明无论如何都不会编译,因为在 C 中 maxXmaxZ 不是常量。它们不能用于静态数组声明。
  • 是的:这个问题被标记为 C++,但如果我有时间,我会分别解决每个问题。
【解决方案3】:

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

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

【讨论】:

  • 我喜欢这个解决方案。我只想在“>>”中添加一个空格,所以它不是移位运算符 - 即:std::vector&lt;std::vector&lt;SDL_Rect&gt; &gt; mapX;
  • 当你想要一个静态大小时,我认为你不应该使用矢量。
【解决方案4】:

在 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

【讨论】:

    【解决方案5】:

    (乍一看,它在我看来是“C 和 C++ 问题之间的差异”。不过我可能弄错了。)

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

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

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

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 2021-12-30
    • 2023-03-25
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    相关资源
    最近更新 更多