为什么编译错误

why compilation error

本文关键字:错误 编译 为什么      更新时间:2023-10-16
#include<iostream>
using namespace std;
const int a[]={1,2,3,4,5};
int b[a[2]];
int main(){return 0;}

为什么此代码会出现编译错误。有人可以简要,简洁和确切地解释行为吗?

我正在使用 gcc 4.6

tt.cc:5:11: error: array bound is not an integer constant before ']' token

我发现错误消息非常解释。您不能声明

int b[a[2]];

你应该使用

int b[3];

而且您很可能想改用std::vector

C++11个技巧

您可以使用 C++11 编译器(如刚刚发布的 GCC 4.7(编译代码,方法是声明

constexpr  int a[]={1,2,3,4,5};

但这对我来说似乎很疯狂。您确实想使用向量或其他容器类型。

对于 C++03:

8.3.4.1 数组声明为:

D1[constant-expression]

在这种情况下,constant-expression是一个整数常量表达式。

如果我们看一下 5.19.1,我们会发现什么是整数常量表达式:

  • 文字
  • const变量
  • 使用常量表达式初始化的整型或枚举类型的静态数据成员
  • 整型或枚举类型的非类型模板参数
  • sizeof表达式
  • 浮动文本(如果强制转换为整型或枚举类型(

特别是,除sizeof外,不能使用以下:

  • 功能
  • 类对象
  • 指针或引用
  • 赋值、递增、递减、函数调用或逗号运算符

在您的情况下,a[2]两者都不是,因此它不能用作数组的长度。

对于C++11:

大致相同,只是您可以将a声明为constexpr并将其用作数组的长度。但是,这种编码风格通常很糟糕,除非你评估了所有其他选项,否则你不应该写这样的东西。

编辑:

我不明白为什么这个问题被否决了。我觉得很有趣:

1(您实际上可以在C++11中执行此操作,constexpr

2(即使在C++03中,行为至少是奇怪的(如果你不搜索标准(:

const int x = 2;
const int a[]={1,2,3,4,5};
int c[x];    //compiles
int b[a[2]]; //doesn't

国际 b[a[2]];

您需要提供编译时可用的数组大小(即固定大小的数组(,或使用malloc等动态分配。