1

我正在将一些 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 函数,因为[]即使没有索引,GC​​C 也会告诉我它在 'struct' 之前是预期的主要表达式

C++ 中的等价物是什么(即使是 C++11 标准)?关键是能够在初始化程序中指定结构字段名称以提高可读性(真正的结构有十几个整数字段和位字段),还能够在初始化程序中看到索引也是一个加分项。

4

1 回答 1

4

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

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

数组中不能有“间隙”(我认为甚至在 C 中也没有)。

于 2012-08-21T14:47:50.127 回答