为什么数组没有形成
why is array not getting formed?
为什么当我定义一个array of floats
时
const int i[] = { 1, 2, 3, 4 };
float f[i[3]]; // Illegal
在任何功能之外(即在全局中),这样做是非法的。而如果我在任何函数(包括main())中做同样的事情,例如:
void f() {
const int i[] = { 1, 2, 3, 4 };
float f[i[3]];
cout << sizeof(f);
}
main()
{
f();
}
然后一切正常,它成功输出大小为 16。为什么会有这种差异?是因为存储位置从静态(最初)更改为堆栈吗?
(PS:我知道C++数组不能使用在编译时未知值的变量来定义,但是,它在函数中是如何工作的?
默认情况下,如果未指定严格的标准合规性,编译器通常允许在C++中使用 C 功能(反之亦然)。GCC 和 Clang 都允许默认使用这样的 C99 功能,即 VLA。(Visual Studio,OTOH,即使在C模式下也不支持VLA。但请注意,只能在块范围内定义 VLA。
6.7.6.2 数组声明符
2 如果标识符被声明为具有可变修改的类型,则该标识符应为普通标识符标识符(如 6.2.3 中所定义),没有链接,并且具有块范围或功能原型范围。如果标识符声明为具有静态或线程存储的对象持续时间,它不应具有可变长度数组类型。
因此,全局 VLA 在C++中不起作用(编译器设置宽松),而函数本地 VLA 则在中工作。
尝试编译以下内容
$ cat float.cpp
int main() {
int i = 2;
const float f[i] = { 1, 2 };
}
有了g++ -std=c++98 -Wall -ansi -pedantic float.cpp
,你会得到类似的东西:
float.cpp: In function 'int main()':
float.cpp:3:18: warning: ISO C++ forbids variable length array 'f' [-Wvla]
float.cpp:3:29: error: variable-sized object 'f' may not be initialized
float.cpp:3:15: warning: unused variable 'f' [-Wunused-variable]
C++11 允许这样做:
#include <iostream>
constexpr int i[] = {1,2,3,4};
float k[i[2]];
int main()
{
std::cout << sizeof(k) << "n";
}
它会很好地形成。
至于最初的问题,这可能是一个 G++ 扩展。
相关文章:
- 数组长度,为什么从命令行获取时不能使用它?
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 为什么我不能将 rand() 与数组的大小一起使用?
- 在C++中传递给函数时,为什么要指定数组大小作为参数
- 为什么我的排序算法会更改数组值
- 为什么std::vector比数组慢
- 为什么调用堆栈数组会导致内存泄漏
- 为什么用结构初始化数组需要指定结构名称
- 为什么我需要C++中不同的排序格式来对这个USACO代码上的数组和优先级队列进行排序
- 为什么可以修改数组 b?
- 为什么我们将单个或多维数组的大小声明为常量值?
- 为什么我的数组双精度函数不起作用?
- 为什么 2 个相同数组的元素彼此相等
- 为什么 &a 和 c++ 中的静态数组相同?
- 初始化不可移动对象数组:为什么这样的代码无法在 GCC 上编译?
- C++ 结构数组 - 为什么它必须是指针
- 在C++中添加两个 2D 数组 - 为什么这个程序崩溃
- 动态分配缓冲空间为二维数组 - 为什么失败
- 非恒定大小的数组:为什么这甚至可以工作
- C++字符数组——为什么是垃圾