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]; |
号
它起作用了。
第一种情况有什么问题?
谢谢。
因此,第一个是非法的,因为数组必须有一个编译时已知界限,而
第二种也是出于同样的原因非法的。
然而,这两种情况通常都会被GCC接受,因为它支持C99风格的运行时大小的数组作为C++的扩展。向GCC传递
编辑:C++标准术语是"积分常量表达式",在标准的第5.19节中详细描述了符合此条件的事物。确切的规则是非平凡的,C++ 11有一个范围更广的事物,由于EDCOX1,2的缘故,但是在C++ 98中,法律事物的列表大致是:
- 整数字面常数
- 只涉及常量的简单表达式
- 整型非类型模板参数
- 整型变量声明为
const 并用常量表达式初始化
你的第二个例子不起作用,也不应该起作用。
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 |
号
由于创建数组时
如果需要一个可变大小的数组,则需要使用
对于只有在C++中运行时已知长度的数组,我们有EDOCX1×9Ω。对于内置数组,必须在编译时知道大小。这对于C++ 11也是适用的,尽管较陈旧的C99标准已经支持动态堆栈数组。还可以看到为什么C++不支持堆栈上的动态数组?