在C ++ 11中将指针转换为多维C样式数组

时间:2018-12-04 17:20:31

标签: c++ arrays g++ clang

我有一个函数,该函数获取指向C样式数组的指针。当我显式设置变量moment-holiday的类型,然后使用Clang编译代码时,出现以下错误:

twoDArray

当我注释掉该行并使用注释掉的部分时,代码将正确编译。当我使用g ++编译代码时,两种变体都会被接受。

这是Clang编译器中的错误,还是g ++在这种情况下接受某些非标准代码?

main.cpp:8: error: variable-sized object may not be initialized
const T (&twoDArray)[dim1][dim2]{*reinterpret_cast<const T (*)[dim1][dim2]>(cVector)};

1 个答案:

答案 0 :(得分:2)

这是非标准的g ++扩展,允许g ++接受代码。 g ++允许您声明不属于C ++标准的VLA(可变长度数组)。要使此代码符合标准,您可以将dim1dim2移到模板参数中,并将它们作为编译时间常数进行传递,例如:

template<size_t dim1, size_t dim2, typename T>
void printVector(const T *cVector)
{
    const T (&twoDArray)[dim1][dim2]{*reinterpret_cast<const T (*)[dim1][dim2]>(cVector)};
//    auto twoDArray{*reinterpret_cast<const T (*)[dim1][dim2]>(cVector)};

    std::cout << "Printing 2D array:  " << std::endl;
    for(int i = 0; i < dim1; i++) {
        for (int j = 0; j < dim2; j++) {
            std::cout << twoDArray[i][j] << " ";
        }
        std::cout << std::endl;
    }
}

int main()
{
    const size_t VEC_SIZE_CONST{2};
    double cVector[VEC_SIZE_CONST][VEC_SIZE_CONST]{{1.1, 2.2}, {3.3, 4.4}};
    printVector<VEC_SIZE_CONST, VEC_SIZE_CONST>(&cVector[0][0] );
    return 0;
}