C++ 为什么阵列没有形成?

C++ 为什么阵列没有形成?,c++,arrays,constants,C++,Arrays,Constants,为什么当我定义一个浮动数组时像: const int i[] = { 1, 2, 3, 4 }; float f[i[3]]; // Illegal 在任何功能之外(即在全局中),这样做是非法的。 如果我在任何函数(包括main())中执行相同的操作,如: void f(){ 常量int i[]={1,2,3,4}; 浮动f[i[3]; 不能C++11允许这样做: #include <iostream> constexpr int i[] = {1,2,3,4}; float k

为什么当我定义一个浮动数组时像:

const int i[] = { 1, 2, 3, 4 };
float f[i[3]]; // Illegal
在任何功能之外(即在全局中),这样做是非法的。 如果我在任何函数(包括main())中执行相同的操作,如:

void f(){
常量int i[]={1,2,3,4};
浮动f[i[3];
不能C++11允许这样做:

#include <iostream>

constexpr int i[] = {1,2,3,4};
float k[i[2]];

int main()
{
  std::cout << sizeof(k) << "\n";
}
#包括
constexpr int i[]={1,2,3,4};
浮动k[i[2];
int main()
{
std::coutC++11允许这样做:

#include <iostream>

constexpr int i[] = {1,2,3,4};
float k[i[2]];

int main()
{
  std::cout << sizeof(k) << "\n";
}
#包括
constexpr int i[]={1,2,3,4};
浮动k[i[2];
int main()
{

STD::默认情况下,CUT< P>,如果您不指定严格的标准符合性,编译器通常允许C++特性使用(反之亦然)。GCC和CLAN都允许默认使用这样的C99特征,即VLAs,(VisualStudio,Otoh,即使在C模式下也不支持VLAS)。但是,VLAs只能在块范围内定义。 6.7.6.2数组声明器

2如果一个标识符被声明为具有可变修改类型,则该标识符应为普通标识符 标识符(如6.2.3所定义),无链接,具有块范围或功能 原型作用域。如果标识符被声明为具有静态或线程存储的对象 持续时间,它不应具有可变长度数组类型

这样,全局VLA在C++(Lax编译器设置)中不起作用,而函数局部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++特性使用(反之亦然)。GCC和CLAN都允许默认使用这样的C99特征,即VLAs,(VisualStudio,Otoh,即使在C模式下也不支持VLAS)。但是,VLAs只能在块范围内定义。 6.7.6.2数组声明器

2如果标识符被声明为具有可变修改类型,则该标识符应为普通标识符 标识符(如6.2.3所定义),无链接,具有块范围或功能 原型作用域。如果标识符被声明为具有静态或线程存储的对象 持续时间,它不应具有可变长度数组类型

这样,全局VLA在C++(Lax编译器设置)中不起作用,而函数局部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]

与MSCV没有区别。在这两种情况下,编译器都报告错误C2057“预期常量表达式”。但是,当我在函数中使用它时,我的编译器没有显示错误!这是来自的g++扩展c99@JoelFalcou_这是什么c99?@cirronimbo与MSCV没有区别。编译器报告错误C2057“预期常量表达式”在这两种情况下。但是当我在函数中使用它时,我的编译器没有显示错误!这是来自c99@JoelFalcou_这是什么c99?@cirronimbo当我编译它时,编译器显示一个错误:“在'int'之前需要构造函数、析构函数或类型转换”你需要使用一个C++11编译器,也就是g++使用--std=C++0x选项当我编译这个时,编译器显示了一个错误:“在'int'之前需要构造函数、析构函数或类型转换”你需要使用一个C++11编译器,也就是g++使用--std=C++0x选项Corry,但我实际上没有得到“6.7.6.2数组声明器”中写的内容特别是最后一行。(@cirronimbo:注意第一行,这是我们感兴趣的,它说VLA不能有链接。其余的是一些更精细的调整(standardese)。很抱歉,我没有真正了解“6.7.6.2数组声明器”中写的内容,特别是最后一行。:(@cirronimbo:注意第一个,这是我们感兴趣的,它说VLA不能有链接。其余的是一些更精细的调整(standardese)。