我正在将一些代码集成到我的库中。这是一个针对速度进行了优化的复杂数据结构,因此,我尝试不对其进行过多修改。集成过程进行得很顺利,实际上已经接近完成(可以编译)。一件事仍然困扰着我。我多次收到C4200警告:
warning C4200: nonstandard extension used : zero-sized array in struct/union
Cannot generate copy-ctor or copy-assignment operator when UDT contains a zero-sized array
代码作品,但此警告使我感到毛骨悚然(尤其是带有copy-ctor的零件)。由于声明了这样的结构,所以出现警告:
#pragma pack( push )
#pragma pack( 1 )
// String
struct MY_TREEDATSTR
{
BYTE btLen;
DWORD dwModOff;
BYTE btPat[0];
};
typedef MY_TREEDATSTR TREEDATSTR;
typedef MY_TREEDATSTR *PTREEDATSTR;
#pragma pack( pop )
注意btPat[0]
。有没有办法在不破坏代码和/或无需对其进行过多更改的情况下轻松地[消除此警告。注意#pragma
,根据此警告有什么意义?为什么结构要这样声明呢? (我的意思是btPat
,不是我理解的#pragma
。)>注意:我看到了this similar question,但实际上并没有帮助我。
更新:正如我所说,代码可以正常工作并给出正确的结果。因此,显然确实不需要复制构造函数或赋值运算符。当我看代码时,没有一个结构得到memcpy编辑。
我正在将一些代码集成到我的库中。这是一个针对速度进行了优化的复杂数据结构,因此,我尝试不对其进行过多修改。集成过程进行得很顺利,实际上几乎是...
btPat[1]
。我认为C ++和C标准都规定数组不能包含0个元素。对于任何依赖于_TREEDATSTR
结构本身大小的代码,都可能导致问题,但是通常这些类型的结构是从缓冲区类型转换的,在这种情况下,缓冲区的第一个字节确定[ C0]。这种方法依赖于C数组上没有边界检查的事实。