-1

为什么以下工作:

#define MAX 100
char MY_ARRAY[MAX];

但以下没有:

int MAX_2 = 200;
char MY_ARRAY_2[MAX_2];

以下是来自 的示例Compiler Explorer。对我来说有趣的是在定义最终的 char 数组之前,事情看起来应该可以工作——所有整数都在数据中定义......

在此处输入图像描述

4

1 回答 1

2

在数组的声明中

#define MAX_VALUE 100
char MY_ARRAY[MAX_VALUE]; 

数组的大小使用整数常量表达式。

在这份声明中

int MAX_VALUE=100;
char MY_ARRAY[MAX_VALUE];

声明了一个可变长度数组。但是您不能声明具有静态存储持续时间的可变长度数组(特别是在文件范围内)。如果编译器支持可变长度数组,您可以在块范围内声明这样的数组。

即使您将const在变量声明中使用限定符,MAX_VALUE例如

const int MAX_VALUE = 100;

根据其在 C 标准中的定义,它不会生成整数常量表达式。

相反,你可以写

enum { MAX_VALUE = 100 };
char MY_ARRAY[MAX_VALUE];

来自 C 标准(6.6 常量表达式)

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

和(6.7.6.2 数组声明符)

4 如果大小不存在,则数组类型是不完整类型。如果大小是*而不是表达式,则数组类型是未指定大小的变长数组类型,只能用于具有函数原型作用域的声明或类型名称中;这样的数组仍然是完整的类型。如果大小是整数常量表达式,并且元素类型具有已知的常量大小,则数组类型不是变长数组类型;否则,数组类型是可变长度数组类型。(可变长度数组是实现不需要支持的条件特性;参见 6.10.8.3。)

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

于 2021-01-12T20:42:36.517 回答