繁体   English   中英

c++中g++和clang++处理VLA定义和初始化的区别

[英]The difference between g++ and clang++'s handling of VLAs definition and initialization in c++

源代码如下:

using namespace std;

int main()
{
        int m = 4;
        int arr[m] = {1, 2, 3, 4};
        printf("%d\n", arr[2]);
        return 0;
}

当我使用g++编译时,它会成功编译为可执行文件。 但是当我用clang++编译时,我得到以下错误:

VLAs.cpp:8:10: error: variable-sized object may not be initialized
        int arr[m] = {1, 2, 3, 4};
                ^
1 error generated.

经过测试,发现clang++可以支持定义VLB( int arr[m]; ),但是不支持在初始化的时候定义VLB。 我想知道这种差异的根本原因

VLA 不是 C++,编译器对它们的支持不同。 在 C 中不支持初始化 VLA,这似乎也是 clang 在 C++ 中所做的。 另一方面,gcc 稍微扩展了对 VLA 的支持。 您的下一个编译器可能根本没有 VLA。

那么,如果 C++ 有更好的机制来解决这个问题,为什么还要费心呢:

#include <vector>
#include <array>

constexpr int n = 4;
std::array arr{1, 2, 3, 4};
std::array<int, n> arr2 = {1, 2, 3, 4};
std::vector<int> arr3 = {1, 2, 3, 4};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM