Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么C++;是否允许在运行时将数组大小传递给函数以构造固定大小的数组?_C++_Arrays - Fatal编程技术网

C++ 为什么C++;是否允许在运行时将数组大小传递给函数以构造固定大小的数组?

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;

根据我的观点,下面的代码不应该编译。然而,它确实做到了,而且打印得非常完美:

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; 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。您可以在编译器手册中看到支持的选项列表。