如何在不破坏代码的情况下正确修复“结构/联合中的零尺寸数组”警告(C4200)?

问题描述 投票:19回答:6

我正在将一些代码集成到我的库中。这是一个针对速度进行了优化的复杂数据结构,因此,我尝试不对其进行过多修改。集成过程进行得很顺利,实际上已经接近完成(可以编译)。一件事仍然困扰着我。我多次收到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编辑。

我正在将一些代码集成到我的库中。这是一个针对速度进行了优化的复杂数据结构,因此,我尝试不对其进行过多修改。集成过程进行得很顺利,实际上几乎是...

c++ memory-management struct warnings
6个回答
13
投票
[我假设您确实希望在纯C ++模式下编译此文件,并且您不想仅在C中编译某些文件,而在C ++及更高版本的链接中编译某些文件。

15
投票
如果这是MSVC编译器(警告消息告诉我),则可以使用#pragma warning禁用此警告,即:

3
投票
尝试将其改为btPat[1]。我认为C ++和C标准都规定数组不能包含0个元素。对于任何依赖于_TREEDATSTR结构本身大小的代码,都可能导致问题,但是通常这些类型的结构是从缓冲区类型转换的,在这种情况下,缓冲区的第一个字节确定[ C0]。这种方法依赖于C数组上没有边界检查的事实。

1
投票
如果抱怨复制构造函数和赋值运算符函数,您不能提供自己的函数。如果您不想要它们,则将其声明为私有。

1
投票
C语言的主要思想是为_TREEDATSTR元素获取所需的额外内存;换句话说,分配将通过malloc(sizeof(_TREEDATSTR)+ len)完成。

0
投票
尽管我意识到这是一个旧线程,但我想为OP问题提供纯c ++ 11解决方案。这个想法是包装要分配的对象,并添加填充以使对象在数组中与2个地址的幂对齐,方法如下:
© www.soinside.com 2019 - 2024. All rights reserved.