C++子对象初始化

C++ sub-object initialization

本文关键字:初始化 对象 C++      更新时间:2023-10-16

我正在将一些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中也不能)。