我是 C++ 新手。我正在阅读一本 C++ 书,上面写着
const int i[] = { 1, 2, 3, 4 };
float f[i[3]]; // Illegal
它说在编译期间浮动变量的声明无效。这是为什么?
假设如果我们使用
int i = 3;
float f[i];
有用。
第一种情况有什么问题?
谢谢。
我是 C++ 新手。我正在阅读一本 C++ 书,上面写着
const int i[] = { 1, 2, 3, 4 };
float f[i[3]]; // Illegal
它说在编译期间浮动变量的声明无效。这是为什么?
假设如果我们使用
int i = 3;
float f[i];
有用。
第一种情况有什么问题?
谢谢。
所以第一个是非法的,因为数组必须有一个编译时已知的界限,而且i[3]
,虽然严格来说在编译时已知,但不满足语言为“编译时已知”设置的标准。
出于同样的原因,第二个也是非法的。
然而,这两种情况通常都会被 GCC 接受,因为它支持 C99 风格的运行时大小的数组作为 C++ 中的扩展。将标志传递-pedantic
给 GCC 以使其抱怨。
编辑: C++ 标准术语是“整数常量表达式”,符合条件的内容在标准的第 5.19 节中有详细描述。确切的规则是不平凡的,C++11 有更广泛的符合条件的事物constexpr
,但在 C++98 中,合法事物的列表大致是:
const
声明为并用常量表达式初始化的整型变量您的第二个示例不起作用,也不应该起作用。
i
必须是恒定的。这有效
const int i = 3;
float f[i];
只是为了阐述塞巴斯蒂安的回答:
创建静态数组时,编译器必须知道它需要保留多少空间。这意味着必须在编译时知道数组大小。换句话说,它必须是文字或常量:
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++ 运行时才知道长度的数组,我们有std::vector<T>
. 对于内置数组,大小必须在编译时已知。C++11 也是如此,尽管更早的 C99 标准已经支持动态堆栈数组。另请参阅为什么 C++ 不支持堆栈上的动态数组?