C ++子对象初始化

时间:2012-08-21 14:44:52

标签: c++ c

我正在将一些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标志会引发一些警告声明 ISO C90禁止指定子对象初始化,但它可以在没有警告的情况下编译,也不会出现-pedantic错误。

my_array的初始化将如下所示:

  • 索引0将具有a,b,c = 0
  • 索引1(MY_INDEX)将具有= 10,b = 20,c = 30
  • 索引2也会有a,b,c = 0
  • 索引3(MY_OTHER_INDEX)将有a,b,c = 42

我非常喜欢这种初始化形式,我发现它简洁易读。

在C ++中使用这种语法将导致GCC认为我正在声明一个lambda函数,因为[],即使没有索引,GC​​C告诉我在'struct'之前预期的primary-expression < / em>的

C ++中的等价物是什么(即使使用C ++ 11标准)? 关键点是能够在初始化程序中指定结构字段名称以便于阅读(真实结构有十几个整数字段和位域),能够在初始化程序中看到索引也是一个加号。

1 个答案:

答案 0 :(得分:4)

C ++没有C支持的所有特殊聚合初始值设定语法。相反,这样说:

my_struct my_array[] = { { },
                         { 10, 20, 30 },
                         { 42, 42, 42 },
                       };

你不能在数组中有“差距”(我认为,即使在C语言中也是如此)。