C++;11可变尺寸吊舱结构 我在C++ 11中写了一个低级的LeWEL数据操作代码,我希望在结构的结尾使用一个已知的灵活数组的C特性。

C++;11可变尺寸吊舱结构 我在C++ 11中写了一个低级的LeWEL数据操作代码,我希望在结构的结尾使用一个已知的灵活数组的C特性。,c++,gcc,c++11,struct,warnings,C++,Gcc,C++11,Struct,Warnings,一旦我将GCC与paramaters一起使用 -Wall -pedantic -std=c++11 我明白了 xxx.h:xx: warning: ISO C++ forbids zero-size array 'variableCell' [-Wpedantic] 这曾经是一个完全正确的特性。请不要告诉我我的方法是错误的——它是并且一直是低级别数据操作的正确方法 为什么标准改变了这一点,以及如何仅禁用这一个特定警告 谢谢 编辑: 抱歉,我把C唯一的错误变成了C++中不包含的例外之一。我会考

一旦我将GCC与paramaters一起使用

-Wall -pedantic -std=c++11
我明白了

xxx.h:xx: warning: ISO C++ forbids zero-size array 'variableCell' [-Wpedantic]
这曾经是一个完全正确的特性。请不要告诉我我的方法是错误的——它是并且一直是低级别数据操作的正确方法

为什么标准改变了这一点,以及如何仅禁用这一个特定警告

谢谢

编辑: 抱歉,我把C唯一的错误变成了C++中不包含的例外之一。我会考虑使用不同的方法。但出于好奇,哪些编译器允许将其作为非标准扩展,以及如何让它们在没有警告的情况下接受它


谢谢

您必须检查哪些标准,C++11仍然不允许0长度数组(§8.3.4/1),以及C99(§6.7.5.2/1)。看起来它们只是C语言的一个特性,但我更愿意说是旧的C语言。您确定找不到更好的解决方案吗?

作为灵活数组成员部分的参考状态:

C++不支持灵活的数组成员

(此特性可以作为一些C++编译器的扩展提供,但可能只适用于POD结构类型)

以及。显然,如果您不使用
/Za
,这也适用于除此之外我还可以找到任何文档的情况


<>我不认为有一种可移植的方法来警告这个警告,但是类似的事情应该适用于<代码> GCC 。

< p>可以用C++操作符与自定义运算符新< /P>进行仿真。
struct VariableCell {
    VariableCell( std::uint32_t sz ) : cellSize(sz) {}

    std::uint8_t* data() { return reinterpret_cast<std::uint8_t*>(this+1); }

    static void* operator new(std::size_t sz, std::uint32_t dataSz) {
        return ::operator new(sz+dataSz);
    }
private:
    std::uint32_t cellSize;
};

std::unique_ptr<VariableCell> CreateVariableCell( std::uint32_t size ) {
    return std::unique_ptr<VariableCell>{ new (size) VariableCell{size} };
}
struct VariableCell{
可变单元(std::uint32_t sz):单元大小(sz){
std::uint8_t*data(){return reinterpret_cast(this+1);}
静态void*运算符新(std::size\u t sz,std::uint32\u t dataSz){
return::运算符new(sz+dataSz);
}
私人:
标准:uint32_t单元尺寸;
};
std::unique\u ptr CreateVariableCell(std::uint32\u t大小){
返回std::unique_ptr{new(size)VariableCell{size};
}

标准没有改变这一点。此功能于1999年添加到C中;C++在1998标准化。至于标准C++,这是不正确的,你似乎假定C++标准是对当前C标准的一组补充。不是。这是一个定义独立语言的独立标准,虽然该语言几乎完全向后兼容C语言,但它几乎完全向后兼容,而且没有跟踪所有“最近”(过去1998年)添加到C语言的内容,至少不是立即添加的。@juanchopanza如果我们关闭所有源于误解的问题,世界上的优秀内容和编程技能将会少得多。纠正错误前提是回答问题的一部分。请告诉我基于虚假前提的取消资格问题的哪一部分。@delnan我不是建议所有基于虚假前提的问题都应该关闭,但有些问题没有什么优点,不太可能得到好的答案。我认为这是其中之一,但如果事实证明不是这样的话,我将很高兴取消我的接近票。@Marco Pagliaricci,我没有投反对票,其他人投了。我很高兴得到任何建设性的答复,你的答复完全符合我的要求。至少我可以投票给你:-)
struct VariableCell {
    VariableCell( std::uint32_t sz ) : cellSize(sz) {}

    std::uint8_t* data() { return reinterpret_cast<std::uint8_t*>(this+1); }

    static void* operator new(std::size_t sz, std::uint32_t dataSz) {
        return ::operator new(sz+dataSz);
    }
private:
    std::uint32_t cellSize;
};

std::unique_ptr<VariableCell> CreateVariableCell( std::uint32_t size ) {
    return std::unique_ptr<VariableCell>{ new (size) VariableCell{size} };
}