3

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

const int SCREEN_WIDTH = 800;
const int SCREEN_HEIGHT = 600;
char textgrid[SCREEN_HEIGHT/16][SCREEN_WIDTH/16];

编译器错误如下:

error: variably modified 'textgrid' at file scope

有没有办法在文件范围内做到这一点?

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

#define TEXTGRID_WIDTH (SCREEN_WIDTH / 16)
#define TEXTGRID_HEIGHT (SCREEN_HEIGHT / 16)
char textgrid[TEXTGRID_HEIGHT][TEXTGRID_WIDTH];
4

3 回答 3

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

或枚举器

enum { SCREEN_WIDTH = 800, SCREEN_HEIGHT = 600 };
于 2018-01-06T19:09:46.210 回答
4

编写 时const int SCREEN_WIDTH = 800,您定义了一个名为SCREEN_WIDTH800 的对象。

因为SCREEN_WIDTH是对象,而不是值,所以不能将它用于常量表达式中的值。尽管它的值是不变的并且对我们来说是显而易见的,但它不符合编译时常量的条件。

要在文件范围内定义数组,您必须使用常量表达式(完全由编译时常量组成的表达式)的维度。

于 2018-01-06T19:37:29.600 回答
4

在 C 中,const限定变量不被视为编译时间常数。您需要一个编译时间常数来提及文件范围内的数组维度。

您可以#define为此目的使用语句。

于 2018-01-06T19:11:05.583 回答