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

2021-12-23 00:00:00 c struct c++

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

I'm currently working with legacy C++ code, successfully compiled with gcc 2.9.X.
I've been asked to port this legacy code to gcc 3.4.X. Most of the errors were easily corrected, but this particular one puzzles me.

上下文:

 struct TMessage 
   {
    THeader header;
    TData data;
   };

 struct THeader
   {
    TEnum myEnum;
    TBool validity;
   };

做了什么:

 const TMessage init = {{0}};

 /* Later in the code ... */
 TMessage message = init;

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

My question(s) :
What is the meaning of the {{}} operator ? Does it initialize the first field (the header) to a binary 0 ? Does it initialize the first field of the first structure (the enum) to (literal) 0 ?

我得到的 3.4.6 错误是 从 'int' 到 'TEnum' 的无效转换,带有一对或两对大括号.

The 3.4.6 error I get is invalid conversion from 'int' to 'TEnum', either with one or two pairs of curly brackets.

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

How can I set my structure to a bunch of 0's without using memset ?

提前致谢.

推荐答案

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

It initialises all fields of the POD structure to 0.

理由:

const SomeStruct init = {Value};

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

Initialises the first field of SomeStruct to Value, the rest of the structure to zero (I forget the section in the standard, but it's there somewhere)

因此:

const SomeOtherStruct init = {{Value}};

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

Initialises the first field of the first field of the structure (where the first field of the structure is itself a POD struct) to Value, and the rest of the first field to zero, and the rest of the structure to 0.

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

Additionally, this only isn't working because c++ forbids implicit conversion of int to enum types, so you could do:

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

相关文章