我目前正在使用遗留的 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?
提前致谢。
答案 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
初始化0
,incompatible conversion
。
所以你必须像这样添加演员:
const TMessage init = {{TEnum(0)}};
在C / C ++中,如果你是partially initialized
结构或数组(只有一些第一个字段/元素),其余部分将由default constructor
初始化(对于基本类型是零初始化) )。 如果没有默认构造函数或构造函数声明为private
,则会发生编译错误。
答案 2 :(得分:1)
你可以将它作为一个多维数组(如果有帮助)。然后使用该命令将两个维度重置为0。这是因为(我假设)结构中的值可以将0作为值。