【问题标题】:Defining a global constant [duplicate]定义一个全局常量
【发布时间】:2021-01-12 20:39:05
【问题描述】:

为什么以下工作:

#define MAX 100
char MY_ARRAY[MAX];

但以下不是:

int MAX_2 = 200;
char MY_ARRAY_2[MAX_2];

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

【问题讨论】:

  • C 的一个怪癖。它没有义务记住整数值,除非它们符合整数常量的定义。
  • 全局数组的大小必须是一个常数。变长数组只能是局部变量。
  • const int 是一个变量,只是不允许你重新分配它。
  • 这个主题在许多其他帖子中都有涉及。建议您使用确切的错误消息进行搜索。例如:herehere
  • 由于它不起作用,编译器会吐出一条错误消息。错误消息非常适合搜索。如果您没有找到所需的内容,最好在问题中包含错误消息,以便将来的读者更容易搜索。

标签: c constants declaration variadic-functions storage-duration


【解决方案1】:

在数组的声明中

#define MAX_VALUE 100
char MY_ARRAY[MAX_VALUE]; 

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

在此声明中

int MAX_VALUE=100;
char MY_ARRAY[MAX_VALUE];

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

即使您将在变量MAX_VALUE 的声明中使用限定符const 就像

const int MAX_VALUE = 100;

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

你可以写

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

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

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

And(6.7.6.2 数组声明符)

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

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

【讨论】:

  • 如果将MAX_VALUE 定义为100,如何将其视为VLA?如果我做到了const,它会工作吗?
  • @David542 不是整数常量表达式。
猜你喜欢
  • 2016-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多