【问题标题】:c++: "expected constant expression"c++:“预期的常量表达式”
【发布时间】:2014-01-21 18:01:58
【问题描述】:

我在以下代码的最后一行收到“预期的常量表达式”错误:

int main() {
    const float a = 0.5f;
    const float b = 2.0f;

    int array_of_ints[int(a*b + 1)];
}

我猜这是因为int(a*b + 1) 在编译期间是未知的,对吧?我的问题是:有什么方法可以对上面的示例进行编码以便它可以工作,并且array_of_ints 的大小为int(a*b + 1)

对这里发生的事情的任何帮助或见解将不胜感激:)

编辑:我意识到矢量可以解决这个问题。但是,我希望数组的内容在堆栈上。

【问题讨论】:

  • 我猜你正在使用 Visual Studio?
  • 制作演员表const int 或一起删除演员表
  • 使用new并在堆上动态分配
  • @EdHeal 更好,std::vector
  • @Borgleader - 正确

标签: c++ expression constants


【解决方案1】:

将这两个常量声明为constexpr(不幸的是,仅在 C++11 之后才可用):

int main() {
    constexpr float a = 0.5f;
    constexpr float b = 2.0f;

    int array_of_ints[int(a*b + 1)];
}

或者(对于 C+11 之前的 C++)您可以use an std::vector

【讨论】:

  • 感谢您的回答,我不知道 constexpr!我不想使用向量,因为我希望数组的内容在堆栈上。
【解决方案2】:

声明一个const int

int main() 
{
    const float a = 0.5f;
    const float b = 2.0f;
    const int s = static_cast<int>(a * b) + 1;

    int array_of_ints[s];
    return 0;
}

Example

请注意,这适用于我目前可以访问的最旧的编译器 (g++ 4.3.2)。

【讨论】:

    【解决方案3】:

    如果您不使用 C++11,请使用 std::vector

    std::vector<int> array_of_ints(int(a*b + 1));
    

    这将导致向量预先分配指定空间并将所有整数初始化为零。

    【讨论】:

    • @DaleWilson,老实说,他比我早 1 到 2 分钟谈到了std::vector。我只是为了完整性才重复它。
    • @DaleWilson,我同意。但我可以向你保证,这不是其中之一。 :)
    【解决方案4】:

    当尝试在运行时或执行期间声明数组的大小时,会发生“预期的常量表达式”错误。 发生这种情况是因为编译器不能;首先,计算数组大小,然后为数组分配那么多空间。 一个简单的解决方案是使用 const int 声明数组,例如 array[45]
    另一种方法是创建一个动态数组: int array_name = new int [size ];

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-02
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多