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

我目前正在使用遗留的C ++代码,使用gcc 2.9.X成功编译。
我被要求将此遗留代码移植到gcc 3.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

所以你必须像这样添加cast:

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

在C / C ++中,如果partially initialized结构或数组(只有一些第一个字段/元素),其余部分将由default constructor初始化(对于基本类型是零初始化)。 如果没有默认构造函数或构造函数声明为private则会发生编译错误。

你可以把它作为一个多维数组(如果这有帮助)。 然后使用该命令将两个维度重置为0。 这是因为(我假设)结构中的值可以取0作为值。