双花括号初始化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作为值。