【问题标题】:Why can array size parameters not be variables, when declared outside of functions? [duplicate]为什么在函数外部声明时数组大小参数不能是变量? [复制]
【发布时间】:2018-10-02 13:01:29
【问题描述】:

为什么不能在 C99 中以变量作为大小参数的函数外部声明数组?

例如,考虑这个代码 sn-p。 这会导致 error: variably modified ‘matrix’ at file scope 编译错误。

static int const height = 5;
static int const width = 5;
static int const matrix[height][width] = { ... };

int main(void){ ... }

我知道 c 中的 const 并不意味着常量。它的意思是“只读”,但我不明白这有什么含义。 那么为什么数组不能从只读内存中获取它们的大小呢?

我知道这个问题可以使用#definesenum 来解决,所以我更感兴趣的是解释为什么会这样。

【问题讨论】:

  • 您需要使用 C 1999 吗?如果您对使用 C 1999 没有特定要求,您应该更喜欢该标准的最新版本,即现在的 2018 版本。
  • 因为这是 C 的定义方式。该语言有一个繁琐的旧规则,即数组大小(在文件范围内)必须是 整数常量表达式,这反过来又限制了您可以用作数组大小的内容。它被视为一个语言错误。 C++ 已经修复了这个错误,C 没有。
  • @EricPostpischil,是的,这个项目需要 C99。
  • 考虑比const 更严格的含义,即“只读”。 const 表示尝试更改是UB。它可以“工作”。鉴于此,static int const matrix[height][width] 不代表具有static int const height = 5 的固定大小数组。为了使matrix[height][width] 成为固定大小,height 必须是常量,而const 没有指定。

标签: c


【解决方案1】:

C99 6.7.5.2/2 数组声明器:

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

【讨论】:

  • 我认为这里的重点不是将数组用作VLA,而是为什么const限定变量不能用作数组大小。
猜你喜欢
  • 1970-01-01
  • 2019-02-08
  • 2015-09-11
  • 1970-01-01
  • 2015-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多