您可以像这样在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)