【问题标题】:gcc runtime declaration of static and auto variables [duplicate]静态和自动变量的 gcc 运行时声明
【发布时间】:2014-06-11 12:13:13
【问题描述】:

我正在使用 gcc 编译器编译我的 C 代码

我的代码是

main()
{
    int i;
    scanf("%d",&i);
    int a[i];
}

... 它在没有任何警告的情况下执行它。但是,如果我使用:

main()
{
    int i;
    scanf("%d",&i);
    static int a[i];
}

...我收到一条错误消息,指出数组的大小不是恒定的。

如果程序的执行从main 函数开始,它不应该给出这样的错误。 如果在main()开始之前先分配静态数据,编译器如何在编译期间产生这样的错误?

【问题讨论】:

  • 从技术上讲,第一个也不应该被允许。我相信它是一个 gcc 扩展的事实。
  • @dlf 仅适用于 C++
  • 你正在使用VLA,不允许是静态的或外部的
  • @CoolGuy i 通过 scanf() 取值

标签: c++ c gcc


【解决方案1】:

C99 标准草案6.7.5.2数组声明符2 段说,变量长度数组不允许是静态的(强调我的 ):

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

在 C++ 中,可变长度数组不是标准的一部分,而是编译器扩展,但 gcc 也应该遵循 C99 规则。

【讨论】:

  • 这是否意味着VLA总是消耗堆栈部分?
  • @Vagish 该标准没有指定,但实际上是的,它们是在堆栈上分配的。
猜你喜欢
  • 1970-01-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
相关资源
最近更新 更多