【问题标题】:MinGW GCC compiles a faulty code without warning or errorMinGW GCC 编译错误代码而没有警告或错误
【发布时间】:2011-04-10 17:36:17
【问题描述】:

您能否向我解释一下为什么 MingW GCC 不在此代码中产生警告:

int main()
{
    int num;
    int people[ num ];
    cout << people[ 0 ];
    cin >> num;
}

但在这里,我只用num = 1替换了最后一条语句,现在出现了警告......

int main()
{
    int num;
    int people[ num ];  //warning: 'num is used uninitialized..'
    cout << people[ 0 ];
    num = 1;
}

【问题讨论】:

  • 等等,警告是否存在?我编辑了但不得不回滚你的问题,因为它自相矛盾。
  • @BoltClock:编辑:哦等等,没关系,这个问题自相矛盾......我编辑了这个问题,应该是这样。
  • 令我惊讶的是,考虑到数组大小应该是一个常数,它们中的 either 都能编译...
  • @Mehrdad:这是一个 GCC 扩展,可能你必须使用 -ansi-std=c++98
  • 在严格模式之外的 gcc 中完全允许使用非常量长度的数组,这是一个 GNU 扩展。尽管这种特殊情况确实很有趣,因为由于 num 没有初始化,因此您是否会引发堆栈溢出或多或少是随机的。

标签: c++ g++ mingw


【解决方案1】:

我认为因为您只使用第一个元素,所以它优化了第一个示例中的 num。它只是创建一个单元素数组。在第二种情况下,由于您实际使用了 num,它会给出错误

【讨论】:

    【解决方案2】:

    这段代码:

    #include <iostream>
    using namespace std;
    
    int main()
    {
        int num;
        int people[ num ];
        cout << people[ 0 ];
        cin >> num;
    }
    

    如果使用-pedantic 标志,只会在g++ 中产生错误(实际上是警告)。警告是:

    ISO C++ forbids variable length array 'people'
    

    这是正确的。可变长度数组的使用是 GCC 扩展,被-pedantic 关闭。请注意,使用-std=whatever 成功编译并不能保证您的代码符合该标准——-std 标志用于打开功能,而不是禁用它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-01
      • 1970-01-01
      • 2015-12-01
      相关资源
      最近更新 更多