【问题标题】:Are arrays with a defined const allowed in C++?C++ 中是否允许使用已定义 const 的数组?
【发布时间】:2018-10-21 04:06:05
【问题描述】:

我尝试使用 C++ 编译器运行以下代码:

#include <iostream>
#include <string>
using namespace std;

int MAX=10;
int list[MAX];

int main()
{
   int sum =0; 

   for (int i = 0; i<=MAX; ++i){
       list[i]=i; 
       }

    for (int i = 0; i<=MAX; ++i){
        sum=sum+list[i];
        }

    cout << sum << endl;
}

但收到此错误: "整数数组绑定在']'标记之前不是整数常量"

我不明白为什么这是一个错误,因为我之前已经将 MAX 定义为 10 整数列表[MAX] 所以它不应该工作吗?

感谢任何帮助

【问题讨论】:

  • 您的for 循环中有一个错误。数组listlist[0]list[MAX-1] 的范围内有MAX 元素。但是您的for 循环使用条件i&lt;=MAX;。当i 等于MAX 时,元素list[i] 将无效。

标签: arrays compiler-errors


【解决方案1】:

这里没有编译器错误消息,只是错误消息所说的内容。您没有在 int MAX 声明之前包含 const

大写字母并且从不改变MAX 的值并不意味着它是一个常数。

请注意,有些编译器接受有一个变量(即 int MAX = 10; 而不是 const int MAX = 10; 用于数组初始化。不要依赖它,因为它不应该发生。

如果要使用变量来初始化数组,则需要使用指针:

int size;
cin >> size;

int *list = new int[size];

【讨论】:

    【解决方案2】:

    我不明白为什么这是一个错误,因为我在 int list[MAX] 之前将 MAX 定义为 10

    您将MAX 定义为10,但您没有MAX 定义为常量。这是一个错误,因为编译器坚持(在这种情况下)数组绑定必须是一个整数常量。

    修复错误的一种方法是使MAX 保持不变...

    const int MAX = 10;
    int list[MAX];
    

    另一种避免错误的方法是将数组从堆栈移到堆上(因为堆数组的边界不必是常数)……

    auto list = new int[MAX];
    

    ...但是这会将list 的类型从int[10] 更改为int *,并且还迫使您在适当的时候通过调用delete 来负责管理列表的生命周期(这可能是一个不小的挑战) …

    delete [] list;
    

    不正确删除list会导致内存泄漏。

    您可以避免错误并且通过使用 unique_ptr 来避免管理数组的责任......

    std::unique_ptr<int[]> list{ new int[MAX] };
    

    然而,许多知名权威人士会争辩说,使用像 std::vector 或 std::array 这样的容器会是更好的方法。例如,在 Effective Modern C++ Scott Meyers says this...

    对于数组的 std::unique_ptr 的存在应该只对您感兴趣,因为 std::array、std::vector 和 std::string 实际上总是比原始数组更好的数据结构选择。我能想到的唯一一种 std::unique_ptr 有意义的情况是,当您使用类似 C 的 API 时,该 API 返回指向您拥有所有权的堆数组的原始指针。

    此时您可能想知道为什么 MAX 必须在您的原始代码中保持不变。我不是语言律师,但我相信简短的回答是因为 C++ 标准规定必须如此

    要了解标准为何强加该要求,您可以阅读问题Why aren't variable-length arrays part of the C++ standard?的一些答案

    【讨论】:

      猜你喜欢
      • 2020-08-06
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多