与C的指定初始值设定项相同的C++是什么?

jya*_*ard 12 c c++

您可以像这样在C中声明一个结构:

typedef struct MyStruct {
    const char *name;
    int (*func1)(void);
    int (*func2)(void);
    int (*func3)(void);
} MyStruct;

int test_func2(void) {
    return 0;
}

MyStruct test_struct = {
    .name   = "buffer",
    .func2  = test_func2,
};
Run Code Online (Sandbox Code Playgroud)

这对于仅定义特定成员非常方便,所有其他成员都设置为0/NULL.

编辑:特别是,这允许不知道如何定义MyStruct的细节,因此它可以在内部更改,添加新成员等.而不会破坏使用此类型的代码.

这不会用C++编译器编译,但是会收到错误:

test.c:23: error: expected primary-expression before ‘.’ token
test.c:24: error: expected primary-expression before ‘.’ token
Run Code Online (Sandbox Code Playgroud)

是否有相同的C++声明实现相同的目标?

谢谢.

编辑:@chris我可以告诉你不明白:)很明显,大多数其他人评论我应该使用什么语法,结构应该如何定义等等.完全忽略了这一点.这与定义结构的正确方法无关,此片段仅用于提供上下文.

至于代码等价,请在代码中的某处说:

MyStruct blah = { NULL, NULL, func2 };
Run Code Online (Sandbox Code Playgroud)

现在,MyStruct将其定义更改为:

typedef struct MyStruct {
  const char *name;
  int (*func4)(void);
  int (*func1)(void);
  int (*func2)(void);
  int (*func3)(void);
} MyStruct;
Run Code Online (Sandbox Code Playgroud)

你的代码仍然可以正常编译,但是引入了一个严重的回归:你现在可以初始化func1成员而不是像以前那样设置func2 ...

问题是关于C++指定的初始化器是否相同:没有.问题关闭.

Jam*_*lis 16

不,C++不支持C99指定的初始化程序.如果您想按名称设置个人成员,您需要通过分配来完成,例如

MyStruct test_struct = MyStruct();
test_struct.name  = "buffer";
test_struct.func1 = test_func1;
Run Code Online (Sandbox Code Playgroud)

  • @jyavenard:如果`test_struct`是一个全局变量,你可以定义一个执行初始化并返回初始化对象的函数,然后使用该函数动态初始化全局变量(例如`MyStruct test_struct = ConstructTheStruct();`) (4认同)