运行时C++数组初始化问题
Run time C++ array initialization question
为什么我们不能在全局区域中使用非常量大小初始化数组大小......外部主(( ....
//outside main - global
int val=5;
int arr[val];
int main()
{
}
这会产生错误
7:12: error: array bound is not an integer constant before ']' token
In function 'int main()':
但是如果我在函数的主/主体内移动相同的代码,错误就会消失......
没有错误,它编译得很好...
int main()
{
int val=5;
int arr[val];
}
这也在函数的主体内部工作正常
void fn(int val)
{
int arr[val];
}
int main()
{
fn(5);
}
感到困惑,移动数组大小如何不能仅在 main 外部初始化?
文件范围内的第一个示例
int val=5; int arr[val]; int main()
在C 和 C++ 上都是非法的。 文件范围内的变量必须在首次使用之前定义(创建(,并继续存在直到程序结束 - 这也意味着,一旦创建,数组就无法调整大小。 对于数组,这意味着(除其他外(它们的维度必须在编译时知道。 使用变量作为数组维度与在编译时知道静态大小的需求相冲突 - 例如,val
的值可以在运行时更改(例如在main()
中(,这将在创建arr
之后。
第二个例子
void fn(int val) { int arr[val]; }
在 C 语言中是合法的(从 1999 年开始(,因为arr
是自动(非静态(存储持续时间。 它将在进入函数体时创建,并在函数返回时不复存在。 这被称为"可变长度数组"或VLA,因为元素的数量是由运行时变量(val
(的值决定的。
在 1999 C 标准之前也不支持 VLA。
在C++,VLA是非法的。 时期。 但是,某些C++编译器确实支持非标准扩展这样的功能。 在C++中,标准容器(例如 出于各种原因,首选std::vector<int>
(,包括在运行时调整其大小的能力。
对于函数内部的数组:
您依赖于GCC扩展,如果您添加-pedantic,您将收到以下警告:
警告:ISO C++禁止可变长度数组 'arr' [-WVLA]
所以C++不支持可变长度数组,建议的替代方案是 std::vector。
对于外部数组函数:
您需要在 int 之前添加 const。是的,我知道编译器理论上可以弄清楚 val 永远不会改变,但由于某种原因(没有人想到将其添加到标准中,或者有充分的理由不这样做(您需要添加 const。
- C++转换参数初始化问题
- 运行时C++数组初始化问题
- wxWidgets 拖放文件事件处理程序初始化问题(无效static_cast)
- C++初始化具有 int 0 问题的unique_ptr
- 使用初始化列表填充C++中的多维结构数组时出现问题
- 它解决了什么问题,对于非真空初始化,生命周期在初始化之前就开始了
- 在构造函数 c++ 中初始化属性时出现问题
- 我是否需要在虚拟继承类的构造函数中初始化基类以解决菱形继承问题?
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- shared_ptr类的向量的向量初始化问题
- public:静态常量字符串声明/初始化问题
- 初始化与类类型相同的静态成员(静态初始化顺序问题)
- 使用 true 初始化布尔数组时出现问题
- 为什么C++中的大括号初始化可以解决STL容器的初始化问题
- 程序在没有输入的情况下退出,它有基本的,驱动的类属性初始化问题
- C++中构造函数的对象初始化出现问题
- 初始化com对象的问题
- 初始化多个纹理 OpenGL、SDL C++ 时出现问题
- 共享库中 __attribute__((构造函数)) 的全局/静态变量初始化问题
- 理解向量初始化时出现问题