初始化C结构的双大括号的含义是什么
What is the meaning of double curly braces initializing a C-struct?
我目前正在使用遗留的C++代码,该代码已使用gcc 2.9.X成功编译。
我被要求将这个遗留代码移植到gcc3.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
。
所以你必须添加这样的铸造:
const TMessage init = {{TEnum(0)}};
在C/C++中,如果使用partially initialized
结构或数组(仅包含前几个字段/元素),则其余字段/元素将由default constructor
初始化(对于基元类型为零初始化)如果没有默认构造函数或构造函数声明为private
,则会发生编译错误
您可以将其视为多维数组(如果有帮助的话)。然后使用该命令将两个尺寸重置为0。这是因为(我假设)结构中的值可以将0作为值。
- 在 c++ 中拥有一组结构的正确方法是什么?
- "perf_event_attr"结构的"read_format"属性的选项到底是什么?
- C++中deque数据结构的大O是什么?
- 将信息输入到下面显示的结构向量中的正确语法/格式是什么
- 不同的类或结构初始化方法之间的性能差异是什么?
- 结构块指的是什么?
- C++ 类层次结构中的"对齐"是什么意思?
- 自定义数据结构的优点是什么?
- 将此私有删除器函数包装在结构中的目的是什么?
- 在只读(即 const)访问器上执行结构化绑定的最佳实践是什么?
- 这里的以下 OOP 结构是什么?
- 用于筛子的最佳数据结构是什么(即一些被划掉的数字列表)?
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 在结构中使用联合的目的是什么?
- c++ 17 中结构自动定义构造函数的规则是什么?
- 对于可重定位的多平台安装,理想的 cmake 安装目录结构是什么?
- 结构化绑定的用例是什么?
- 从包含 IP 标头片段的二进制文件中读取结构的最佳方法是什么
- 是什么让这种易失性打破了结构的指针算法?
- 这个嵌套结构声明是什么意思?