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

时间:2011-06-06 11:12:21

标签: c++ c struct

我目前正在使用遗留的 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?它是否将第一个结构的第一个字段( enum )初始化为(文字)0?

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

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

提前致谢。

3 个答案:

答案 0 :(得分:19)

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

理由:

const SomeStruct init = {Value};

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

因此:

const SomeOtherStruct init = {{Value}};

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

此外,这只是行不通,因为c ++禁止将int隐式转换为枚举类型,所以你可以这样做:

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

答案 1 :(得分:3)

  • 第一个括号是struct TMessage
  • 第二个括号是struct THeader
  • 零文字适用于TEnum myEnum

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

所以你必须像这样添加演员:

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

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

答案 2 :(得分:1)

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