gpt4 book ai didi

c++ - 如何在不破坏代码的情况下正确修复 "zero-sized array in struct/union"警告(C4200)?

转载 作者:IT老高 更新时间:2023-10-28 21:55:32 26 4
gpt4 key购买 nike

我正在将一些代码集成到我的库中。这是一个针对速度进行了优化的复杂数据结构,所以我尽量不要对其进行过多修改。集成过程进展顺利,实际上几乎完成(它编译)。一件事仍然困扰着我。我多次收到 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-ed。

最佳答案

如果这是一个 MSVC 编译器(这是警告消息告诉我的),那么您可以使用 #pragma 警告禁用此警告,即:

#pragma warning( push )
#pragma warning( disable : 4200 )
struct _TREEDATSTR
{
BYTE btLen;
DWORD dwModOff;
BYTE btPat[0];
};
#pragma warning( pop )

顺便说一句,关于复制构造函数的消息并不令人毛骨悚然,而是一件好事,因为这意味着,如果没有 btPat 中的未知字节,您就无法复制 _TREEDATSTR 的实例:编译器有不知道 _TREEDATSTR 到底有多大(因为数组大小为 0),因此拒绝生成复制构造函数。这意味着,你不能这样做:

_TREEDATSTR x=y;

无论如何都不应该工作。

关于c++ - 如何在不破坏代码的情况下正确修复 "zero-sized array in struct/union"警告(C4200)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3350852/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com