【问题标题】:expression must have a constant value error in c++ [duplicate]表达式在c ++中必须有一个常量值错误[重复]
【发布时间】:2011-11-21 05:30:07
【问题描述】:

可能重复:
Is there a way to initialize an array with non-constant variables? (C++)

我有以下代码:

vector<vector<vec2>> vinciP;
    int myLines = -1;
    myLines = drawPolyLineFile("vinci.dat", vinciP);
    if (myLines > -1)
    {
        cout << "\n\nSUCCESS";
        vec2 vPoints[myLines];
        for (int i = 0; i < NumPoints; ++i)
        {
            vPoints[i] = vinciP[0][i];
        }
    }

'vec2 vPoints[myLines];' 行出现错误这表示表达式必须具有恒定值。我不明白为什么会出现此错误,有什么帮助吗?

是因为 myLines 可能是负数吗?身份证。

【问题讨论】:

  • vector&lt;vector&lt;vec2&gt;&gt; vinciP 可能无法在 VC++ 中编译。对于可移植性,更好的做法是vector&lt;vector&lt;vec2&gt; &gt; vinciP

标签: c++ arrays visual-studio vector


【解决方案1】:
vec2 vPoints[myLines];

由于myLines 不是const 表达式((这意味着,它在编译时是未知的),所以上面的代码声明了一个可变长度数组,这在C++ 中是不允许的。只有 C99 有这个特性。你的编译器可能有这个作为扩展(但这不是标准 C++)。

此类常见问题的解决方案是:使用std::vector&lt;T&gt;作为:

std::vector<vec2> vPoints(myLines);

它现在应该可以工作了。

【讨论】:

  • GCC 在 c++ 模式下将此作为扩展提供。令我惊讶的是,这个功能还没有进入 c++。
  • @CaptainGiraffe:VLA 是在 C99 中引入的,C++ 是基于 C98 的,而在 C99 引入 VLA 的时候,C++ 已经有了向量,所以他们从不觉得有迫切需要。
  • @Als,我不知道“C++ 基于 C98”,我假设您指的是 0x,也许我应该为此创建一个单独的问题,但是 std 的存在: :vector 并没有真正让我相信 VLA 没有用处。
  • @CaptainGiraffe:确实,VLA 在 C++ 中可以提供的用处是多方面的,但要让它们在 C++ 中工作似乎还有很多工作要做。 Here 是一个讨论这个问题的线程。
  • @CaptainGiraffe:不需要创建另一个主题:有人已经创建了这个。看到这个:stackoverflow.com/questions/7458857/…
【解决方案2】:

是因为 myLines 可能是负数吗?
不,这是因为myLines 不是编译时常量。

说明:

vec2 vPoints[myLines];

创建一个可变长度的数组,其中myLines 的值将在运行时确定。 Variable length arrays 在 C++ 中是不允许的。这是 C99 中引入的一个特性,C++ 标准不支持它。一些 C++ 编译器虽然支持它作为扩展,但它仍然不符合标准。

对于 C++,数组的大小应该在编译时知道,因此必须是编译时常量。 myLines 不是编译时间常数,因此会出现错误。

你应该使用 std::vector

【讨论】:

    【解决方案3】:
    vec2 vPoints[myLines];
    

    数组大小必须是编译时间常数。 myLines 不是编译时间常数。相反,使用 new 分配内存,甚至更好地使用 std::vector

    【讨论】:

    • 使用new是错误的!千万不要用new,不用new就学会编程。这里不需要new
    • +1 我知道 new 对于 C++ 来说是 old :)
    【解决方案4】:

    C++ 没有变长数组。数组的大小必须在编译时确定。 myLines 的值只有在运行时才知道,所以这不起作用。

    要拥有仅在运行时知道大小的数组,请使用std::vector

    std::vector<vec2> vPoints(myLines);
    

    【讨论】:

      【解决方案5】:

      您收到该错误是因为静态数组需要静态(恒定)大小。由于vPoints 中的组件数量是动态的,因此请考虑使用动态数组。或者最好还是坚持vector

      【讨论】:

        猜你喜欢
        • 2012-07-27
        • 2014-10-21
        • 1970-01-01
        • 1970-01-01
        • 2021-12-02
        • 1970-01-01
        • 1970-01-01
        • 2021-01-14
        • 1970-01-01
        相关资源
        最近更新 更多