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)
根据 C 标准(6.7.6.2 数组声明符)
- ...如果大小是整数常量表达式并且元素类型具有已知的常量大小,则该数组类型不是变长数组类型;否则,数组类型是变长数组类型。
和(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)