C++子对象初始化
C++ sub-object initialization
我正在将一些C代码移植到C++,但我无法解决处理子对象初始化的特定问题。
以下代码是我的意思的一个示例:
#include <stdio.h>
#define MY_INDEX 1
#define MY_OTHER_INDEX 3
/* Structure declaration */
struct my_struct
{
int a;
int b;
int c;
};
/* Array declaration and initialization */
struct my_struct my_array[] =
{
[0] = (struct my_struct) {0, },
[MY_INDEX] = ((struct my_struct) {
.a = 10,
.b = 20,
.c = 30
}),
[MY_OTHER_INDEX] = ((struct my_struct) {
.a = 42,
.b = 42,
.c = 42
})
};
/** Test code */
int
main(void)
{
unsigned int i;
for (i = 0; i < sizeof(my_array)/sizeof(struct my_struct); i++)
printf("Index %u: a=%d, b=%d, c=%dn",
i, my_array[i].a, my_array[i].b, my_array[i].c);
return 0;
}
虽然添加-pedantic
标志会引发一些警告,指出ISO C90禁止指定要初始化的子对象,但使用gcc -ansi -Wall
可以编译它而不会出现警告或错误。
my_array
的初始化将类似于:
- 索引0将具有a、b、c=0
- 索引1(
MY_INDEX
)的a=10,b=20,c=30 - 索引2也将具有a,b,c=0
- 索引3(
MY_OTHER_INDEX
)的a、b、c=42
我真的很喜欢这种初始化形式,我觉得它简洁易读。
在C++中使用这种语法会导致GCC认为我是因为[]
而声明了一个lambda函数,即使没有索引,GCC也会告诉我它在"struct"之前需要primary-expression。
C++中的等价物是什么(即使使用C++11标准)?的关键点是能够在初始值设定项中指定结构字段名称以提高可读性(实际结构有十几个整数字段和位字段),还能够在初始设定项中看到索引也是一个好处。
C++没有C支持的所有特殊聚合初始值设定项语法。相反,可以这样说:
my_struct my_array[] = { { },
{ 10, 20, 30 },
{ 42, 42, 42 },
};
数组中不能有"间隙"(我认为,即使在C中也不能)。
相关文章:
- C++使用整数的压缩数组初始化对象
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- 在 c++ 中初始化对象
- C++ 手动分配和初始化对象
- 使用运算符"="在C++中用值初始化对象
- 当我不需要数据库中的所有值时,如何部分初始化 c++ 对象?
- 如何初始化对象数组?
- 在C++中使用默认构造函数初始化对象的不同方法
- 使用默认构造函数初始化对象的不同方法
- 是否可以在编译时初始化对象的 C 样式函数指针,以便它调用对象的成员函数?
- 如何在线程中初始化对象,然后在其他地方使用它?
- 在没有默认构造函数时使用垃圾数据初始化对象
- 如果在 C++ 构造函数中以错误的顺序初始化对象数据,会发生什么类型的错误
- 初始化对象以在 C++08 中作为参数传递的首选语法是什么?
- 在 c++ 中复制对未初始化对象的引用
- 在成员变量在另一个文件中发生更改后,调用与初始化对象分开的函数
- 在不放置新运算符的情况下,在预分配的内存上使用虚函数初始化对象 - 这可能吗?如果没有,为什么
- 复制 CTOR 与赋值运算符以初始化对象(性能)
- 当您通过分配初始化C 对象时会发生什么
- 获取未初始化对象成员的地址是否定义良好?