关于编译:c ++中const的用法

usage of const in c++

我是C++新手,我正在读一本C++的书,上面写着

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

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

假设我们使用

1
2
int i = 3;
float f[i];

它起作用了。

第一种情况有什么问题?

谢谢。


因此,第一个是非法的,因为数组必须有一个编译时已知界限,而i[3]虽然严格来说在编译时已知,但不满足语言设置为"编译时已知"的条件。

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

然而,这两种情况通常都会被GCC接受,因为它支持C99风格的运行时大小的数组作为C++的扩展。向GCC传递-pedantic标志,让GCC投诉。

编辑:C++标准术语是"积分常量表达式",在标准的第5.19节中详细描述了符合此条件的事物。确切的规则是非平凡的,C++ 11有一个范围更广的事物,由于EDCOX1,2的缘故,但是在C++ 98中,法律事物的列表大致是:

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


你的第二个例子不起作用,也不应该起作用。i必须是常量。这个工作

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


就为了解释塞巴斯蒂安的回答:

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

1
2
3
4
5
6
7
const int SIZE = 3;
int arr[SIZE]; // ok

int arr[3]; // also ok

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

由于创建数组时size的值可能不同,因此oompiler不知道为数组保留多少空间。如果您声明它为const,它知道值不会改变,并且可以保留适当的空间量。

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


对于只有在C++中运行时已知长度的数组,我们有EDOCX1×9Ω。对于内置数组,必须在编译时知道大小。这对于C++ 11也是适用的,尽管较陈旧的C99标准已经支持动态堆栈数组。还可以看到为什么C++不支持堆栈上的动态数组?