【问题标题】:C declaring a 2d array using constantsC使用常量声明一个二维数组
【发布时间】:2010-11-08 17:22:39
【问题描述】:

我有一个游戏的头文件,它为棋盘声明了一个二维数组。

#ifndef GAME_H_
#define GAME_H_

static const int columns = 15;
static const int rows = 15;

int board[rows][columns];

#endif /* GAME_H_ */

我收到一个错误“error: variably modified 'board' at file scope”。

【问题讨论】:

    标签: c arrays constants


    【解决方案1】:

    C 不允许 const 变量作为数组边界。改用枚举:

    enum { columns = 15, rows = 15 };
    

    【讨论】:

      【解决方案2】:

      该表达式是不允许的,它可以在 C++ 中使用,解决这个问题的唯一方法是这样定义它:

      #ifndef GAME_H_
      #define GAME_H_
      
      #define COLUMNS 15
      #define ROWS 15
      
      int board[ROWS][COLUMNS];
      
      #endif /* GAME_H_ */
      

      【讨论】:

        【解决方案3】:

        从 C99 开始,您可以声明所谓的可变长度数组 (VLA),其中数组维度的大小是非常量表达式; IOW,你可以这样做:

        int foo()
        {
          int x = 5;
          int y = 10;
          int values[x][y];
          ...
        }
        

        请注意,这适用于 C99; C89 和更早版本要求您对数组维度使用编译时常量表达式。

        VLA 的问题在于,由于它们的工作方式,它们只能在块范围中声明(即在函数内或函数中的复合语句内);它们可能不会被声明为staticextern,并且它们可能不会在文件范围内声明(这是您的特定错误消息的来源)。

        在这种特殊情况下,您将需要使用编译时常量表达式(const 限定的变量不是):

        #define COLUMNS 15
        #define ROWS    15
        
        extern int board[ROWS][COLUMNS];
        

        注意在数组声明中添加了extern 关键字。您不希望头文件中的声明成为数组的 定义 声明;相反,将 defining 声明放在实际实现游戏板的源文件中。否则,包含该标头的每个源文件都将尝试为board 创建自己的定义,并由链接器将其全部排序。

        【讨论】:

          【解决方案4】:
          int board[rows][columns];
          

          不是有效的 C。您只能使用常量定义数组,而不能使用变量引用。即使变量引用引用了一个常量值,行和列也是对常量值的引用,而不是常量值本身。

          有很多方法可以让你随心所欲地工作:

          1. 您可以在预处理器中定义“变量”,以便在编译前将它们展平为常量。
          2. 您可以将这些值定义为枚举 enum 的一部分,因为 C 编译器的枚举规则是在检测到类型不匹配时自动将它们转换为其常量值。

          【讨论】:

            【解决方案5】:

            Try this

            看看上面的链接对你有没有帮助。

            【讨论】:

            • 我知道这个答案(以及你链接到的问题)现在已经很老了,但你能把重要的部分拿出来回答吗? (或者如果这个问题是你所链接的内容的欺骗,请投一个欺骗票)
            【解决方案6】:

            数组声明在编译前需要一个常量值。您可以在其中#define 变量或使用指针使其像数组一样工作。两种方式都很好,会给你相同的结果和简单性。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-05-26
              • 1970-01-01
              • 1970-01-01
              • 2022-01-15
              • 2010-12-21
              • 1970-01-01
              • 2012-10-19
              相关资源
              最近更新 更多