C++ 为什么C++;是否允许在运行时将数组大小传递给函数以构造固定大小的数组?
根据我的观点,下面的代码不应该编译。然而,它确实做到了,而且打印得非常完美: 01 2 3 4 5 6 7 8 9 10 11 12 13 14 事实上,即使我从参数中删除“const”,它也会这样做C++ 为什么C++;是否允许在运行时将数组大小传递给函数以构造固定大小的数组?,c++,arrays,C++,Arrays,根据我的观点,下面的代码不应该编译。然而,它确实做到了,而且打印得非常完美: 01 2 3 4 5 6 7 8 9 10 11 12 13 14 事实上,即使我从参数中删除“const”,它也会这样做 void arrayTest(const int size) { int myArray[size]; for(int i=0; i<size; i++) { myArray[i] = i; } for(int i=0; i<size;
void arrayTest(const int size) {
int myArray[size];
for(int i=0; i<size; i++) {
myArray[i] = i;
}
for(int i=0; i<size; i++) {
cout << myArray[i] << " ";
}
cout << endl;
}
int main() {
arrayTest(15);
return 0;
}
void数组测试(常量整数大小){
int myArray[size];
对于(int i=0;i
为什么C++允许运行时数组的大小传递给函数,以便构造一个固定大小的数组?< /p>
C++语言不允许使用函数参数作为数组变量的长度。数组的长度必须是编译时常量表达式
在您的示例中,myArray
的长度不是编译时常量表达式,因此程序的格式不正确
那么,为什么要编译呢
因为编译器选择了这样做。C++语言只允许编译器对不合格的程序进行编译失败。它们允许编译成功,这允许编译器扩展语言。
C++标准要求编译器对不合格的程序进行诊断(除非允许由特定的规则执行),如果没有为您发出诊断消息,则编译器不符合标准。
以下是一致性编译器的输出示例:
警告:ISO C++禁止可变长度数组“MyRoad”[-Wvla ] < /P>
某些编译器(不幸的是)默认允许可变长度数组。对于GCC,请检查如何禁用它的问题:Yksisarvinen,您是否建议编译器在后台使用动态分配?“后台”编译器使用某种“动态分配”在堆栈上,VLAs被分配到这个问题:你可能想看看这个问题:了解引擎盖下面的内容。但是,这不是有效的C++语法,它只是因为编译器扩展而编译。添加这个标志之后,我的编译器现在考虑它是一个错误,并且不再编译:Werror =vla@softwarelover如果你是你唱Clang或GCC,然后你可以使用-std=c++17-pedantic
,它要求编译器遵守作为参数给出的特定标准。这样你就不会限制自己只禁用一种语言扩展。那太好了,eerorika。我可以使用-std=c++14-pedantic而不是17吗?@softwarelover这会让我感到惊讶编译器符合C++14。您可以在编译器手册中看到支持的选项列表。