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

Isa*_*rke 18 c c++ struct

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

上下文 :

 struct TMessage 
   {
    THeader header;
    TData data;
   };

 struct THeader
   {
    TEnum myEnum;
    TBool validity;
   };
Run Code Online (Sandbox Code Playgroud)

做了什么 :

 const TMessage init = {{0}};

 /* Later in the code ... */
 TMessage message = init;
Run Code Online (Sandbox Code Playgroud)

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

我得到的3.4.6错误是invalid conversion from 'int' to 'TEnum',有一对或两对大括号.

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

提前致谢.

Jam*_*mes 20

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

理由:

const SomeStruct init = {Value};
Run Code Online (Sandbox Code Playgroud)

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

从而:

const SomeOtherStruct init = {{Value}};
Run Code Online (Sandbox Code Playgroud)

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

另外,这只是不起作用,因为c ++禁止隐式转换int为枚举类型,所以你可以这样做:

const SomeOtherStruct init = {{TEnum(0)}};
Run Code Online (Sandbox Code Playgroud)

  • @Autopulated:如果没有默认构造函数,则所有非静态成员(也用于基类)都是值初始化的(它基本上是递归工作的).对于基本类型,值初始化意味着零初始化(这是递归的终止). (4认同)
  • 标准的相关部分是8.5.1.7:*如果列表中的初始化程序少于聚合中的成员,则未明确初始化的每个成员都应进行值初始化.* (3认同)