在c ++中使用const

时间:2013-09-25 13:47:35

标签: c++ compilation compiler-errors const

我是C ++的新手。我正在阅读一本C ++书,它说

const int i[] = { 1, 2, 3, 4 };
float f[i[3]]; // Illegal

它说在编译期间浮点变量的声明是无效的。为什么?

假设我们使用

int i = 3;
float f[i];

有效。

第一种情况有什么问题?

感谢。

4 个答案:

答案 0 :(得分:15)

所以第一个是非法的,因为一个数组必须有一个编译时已知的绑定,i[3]虽然严格地说在编译时已知,但不符合语言为“编译时已知”设置的标准

由于同样的原因,第二种也是非法的。

但是,这两种情况通常都会被GCC接受,因为它支持C99样式的运行时大小的数组作为C ++中的扩展。将-pedantic标志传递给GCC以使其抱怨。

编辑: C ++标准术语是“整数常量表达式”,符合条件的内容将在标准的第5.19节中详细介绍。确切的规则是非平凡的,C ++ 11具有更广泛的由于constexpr而有资格的事物,但在C ++ 98中,合法事物的列表大致是:

  • 整数文字
  • 仅涉及常量的简单表达式
  • 整数类型的非类型模板参数
  • 声明为const并用常量表达式
  • 初始化的整数类型的变量

答案 1 :(得分:3)

你的第二个例子不起作用,它应该不起作用。 i必须保持不变。这工作

const int i = 3;
float f[i];

答案 2 :(得分:2)

只是为了阐述塞巴斯蒂安的回答:

创建静态数组时,编译器必须知道需要保留多少空间。这意味着在编译时必须知道数组大小 。换句话说,它必须是文字或常数:

const int SIZE = 3;
int arr[SIZE]; // ok

int arr[3]; // also ok

int size = 3;
int arr[size]; // Not OK

由于size的值在创建数组时可能会有所不同,因此编译器将不知道为数组保留多少空间。如果您将其声明为const,则它知道该值不会更改,并且可以保留适当的空间量。

如果您需要一个可变大小的数组,则需要使用new动态创建它(并确保在完成后使用delete进行清理)。

答案 3 :(得分:0)

对于长度仅在C ++运行时知道的数组,我们有std::vector<T>。对于内置数组,必须在编译时知道大小。对于C ++ 11也是如此,尽管更老的C99标准已经支持动态堆栈数组。另请参阅Why doesn't C++ support dynamic arrays on the stack?

的已接受答案