初始化C结构的双大括号的含义是什么

What is the meaning of double curly braces initializing a C-struct?

本文关键字:是什么 结构 初始化      更新时间:2023-10-16

我目前正在使用遗留的C++代码,该代码已使用gcc 2.9.X成功编译。
我被要求将这个遗留代码移植到gcc3.4.X。大多数错误都很容易纠正,但这个特殊的错误让我很困惑。

上下文:

 struct TMessage 
   {
    THeader header;
    TData data;
   };
 struct THeader
   {
    TEnum myEnum;
    TBool validity;
   };

做了什么:

 const TMessage init = {{0}};
 /* Later in the code ... */
 TMessage message = init;

我的问题
{{}}运算符的含义是什么?它是否将第一个字段(标头)初始化为二进制0?它是否将第一个结构(枚举)的第一个字段初始化为(文字)0?

我得到的3.4.6错误是invalid conversion from 'int' to 'TEnum',要么有一对或两对花括号。

如何在不使用memset的情况下将结构设置为一堆0?

提前谢谢。

它将POD结构的所有字段初始化为0。

理由:

const SomeStruct init = {Value};

将SomeStruct的第一个字段初始化为Value,将结构的其余部分初始化为零(我忘记了标准中的部分,但它在某个地方)

因此:

const SomeOtherStruct init = {{Value}};

将结构的第一字段的第一字段(其中结构的第一个字段本身是POD结构)初始化为Value,将第一字段的其余部分初始化为零,将结构的其余部分初始为0。

此外,这只是不起作用,因为c++禁止将int隐式转换为枚举类型,所以您可以执行以下操作:

const SomeOtherStruct init = {{TEnum(0)}};
  • 第一个大括号用于struct TMessage
  • 第二个大括号用于struct THeader
  • 零文字用于TEnum myEnum

在这种情况下,您将使用int 0初始化TEnum,即incompatible conversion

所以你必须添加这样的铸造:

const TMessage init = {{TEnum(0)}};

在C/C++中,如果使用partially initialized结构或数组(仅包含前几个字段/元素),则其余字段/元素将由default constructor初始化(对于基元类型为零初始化)如果没有默认构造函数或构造函数声明为private,则会发生编译错误

您可以将其视为多维数组(如果有帮助的话)。然后使用该命令将两个尺寸重置为0。这是因为(我假设)结构中的值可以将0作为值。