在文件范围内初始化 C 中的数组大小

dva*_*ria 3 c arrays declaration variable-length-array storage-duration

我想根据计算初始化一个数组,但是当我尝试这样做时编译器给我一个错误(我使用的是 GCC 版本 6.3.0):

const int SCREEN_WIDTH = 800;
const int SCREEN_HEIGHT = 600;
char textgrid[SCREEN_HEIGHT/16][SCREEN_WIDTH/16];
Run Code Online (Sandbox Code Playgroud)

编译器错误如下:

error: variably modified 'textgrid' at file scope
Run Code Online (Sandbox Code Playgroud)

有没有办法在文件范围内执行此操作?

看来我不能使用计算作为 #define 语句的一部分来完成此操作,因为以下给出了相同的错误:

#define TEXTGRID_WIDTH (SCREEN_WIDTH / 16)
#define TEXTGRID_HEIGHT (SCREEN_HEIGHT / 16)
char textgrid[TEXTGRID_HEIGHT][TEXTGRID_WIDTH];
Run Code Online (Sandbox Code Playgroud)

Vla*_*cow 5

根据 C 标准(6.7.6.2 数组声明符)

  1. ...如果大小是整数常量表达式并且元素类型具有已知的常量大小,则该数组类型不是变长数组类型;否则,数组类型是变长数组类型。

和(6.7.6.2 数组声明符)

2 如果标识符被声明为具有可变修改类型,则它应是普通标识符(如 6.2.3 中定义),没有链接,并且具有块作用域或函数原型作用域。如果标识符被声明为具有静态或线程存储持续时间的对象,则它不应具有可变长度数组类型。

最后(6.6 常量表达式)

6 整型常量表达式应具有整型类型,并且只能具有整型常量、枚举常量、字符常量、结果为整型常量的 sizeof 表达式以及作为强制转换的直接操作数的浮点常量的操作数。整数常量表达式中的强制转换运算符只能将算术类型转换为整数类型,除非作为 sizeof 运算符的操作数的一部分。

所以你可以使用定义的命名常量,例如

#define SCREEN_WIDTH  800
#define SCREEN_HEIGHT 600
Run Code Online (Sandbox Code Playgroud)

或枚举器

enum { SCREEN_WIDTH = 800, SCREEN_HEIGHT = 600 };
Run Code Online (Sandbox Code Playgroud)

  • 我认为在没有解释的情况下向人们引用标准中的内容对教学没有好处。为了理解标准中的引述,人们必须已经具备大量的基础知识。但提出基本问题的人一般还没有达到那个水平。例如,学过高中和大学数学的人多年来一直在数学课本中看到“Let x = 3”,因此他们习惯于认为名称实际上可以**是**一个值。为了教他们编程,我们必须教他们一个新概念,即名称标识一个对象,而值在该对象中。 (2认同)
  • @machine_1:任何寻找这个问题答案的人都可能处于同一水平。解释事情会如何影响质量?我并不是说要删除这些引文,只是说不解释就把它们扔给人们,这对教学没有好处。以**适合读者知识的方式解释概念。然后,如果您愿意,可以用标准中的引号来支持答案。 (2认同)