我正在将一些 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=%d\n",
i, my_array[i].a, my_array[i].b, my_array[i].c);
return 0;
}
它可以在没有警告或错误的情况下编译gcc -ansi -Wall
,尽管添加-pedantic
标志会引发一些警告,指出ISO C90 禁止指定要初始化的子对象。
的初始化my_array
将类似于 if :
- 索引 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' 之前是预期的主要表达式。
C++ 中的等价物是什么(即使是 C++11 标准)?关键是能够在初始化程序中指定结构字段名称以提高可读性(真正的结构有十几个整数字段和位字段),还能够在初始化程序中看到索引也是一个加分项。