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

标签 c++ arrays

根据我的意见,以下代码不应编译。然而,它确实可以完美地打印:

0 1 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;
}

我很困惑,因为我知道数组的大小是一个必须在编译时评估的 constexp。另外,我不涉及任何类型的动态分配(即我不使用 malloc()、new 等)。函数的局部变量都是在堆栈上创建的。无论如何,没有堆参与!

那么,为什么它会编译?

最佳答案

Why does C++ allow passing the array size at run-time to a function in order to construct a fixed-size array?

C++ 语言不允许允许您使用函数参数作为数组变量的长度。数组的长度必须是编译时常量表达式。

示例中 myArray 的长度不是编译时常量表达式,因此程序格式错误。

So, why is it compiling?

因为你的编译器选择这样做。 C++ 语言仅仅允许编译器无法编译格式错误的程序。它们可以成功编译,这让编译器可以扩展语言。您正在使用语言扩展。

C++ 标准确实要求编译器诊断格式错误的程序(除非特定规则允许不这样做),如果它没有为您发出诊断消息,则编译器不符合标准。

以下是符合标准的编译器的输出示例:

warning: ISO C++ forbids variable length array 'myArray' [-Wvla]

关于c++ - 为什么 C++ 允许在运行时将数组大小传递给函数以构造固定大小的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58150580/

相关文章:

c++ - 使用 Armadillo 库访问矩阵列而不创建数据拷贝

javascript - 使用 Javascript 和 Google AppS 脚本均匀/交替合并多个数组

c# - 根据正则表达式拆分字符串

c++ - 从文件中读取数字,递增并写回

c# - 传递信息并从另一个线程通知一个线程的最简单方法

php - 从 Shopify 商店卸载应用程序后,从 PHP 应用程序中删除商店详细信息

python - 将多个参数传递给函数的最有效方法?

arrays - 右对齐数组内容

c++ - 连通分量分析,拆分分量如何处理?

c++ - 如何在 C++ 类函数中将 std::map 作为默认构造函数参数传递