【发布时间】:2012-06-02 01:49:10
【问题描述】:
您可以像这样在 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,
};
这对于仅定义特定成员非常方便,所有其他成员都设置为 0/NULL。
编辑:特别是,这允许不知道如何定义 MyStruct 的详细信息,因此它可以在内部更改、添加新成员等。而无需使用此类型破坏代码。
然而,这不会用 C++ 编译器编译,出现错误:
test.c:23: error: expected primary-expression before ‘.’ token
test.c:24: error: expected primary-expression before ‘.’ token
是否有实现相同功能的等效 C++ 声明?
谢谢。
编辑:@chris 我可以告诉你不明白 :) 很明显,大多数其他人评论我应该使用什么语法,应该如何定义结构等等。完全没有抓住重点。这不是关于定义结构的正确方法,这个 sn-p 只是为了提供一个上下文。
至于代码等价, 在代码中的某处说出你所做的:
MyStruct blah = { NULL, NULL, func2 };
现在 MyStruct 将其定义更改为:
typedef struct MyStruct {
const char *name;
int (*func4)(void);
int (*func1)(void);
int (*func2)(void);
int (*func3)(void);
} MyStruct;
您的代码仍然可以正常编译,但引入了严重的回归:您现在将初始化 func1 成员,而不是像以前那样设置 func2...
问题是关于 C++ 指定的初始化器是否等效:没有。问题解决了。
【问题讨论】:
-
在 C++ 中,整个
typedef struct A { ... } A;是毫无意义的。使用这个:struct A { ... };. -
这些被称为designated initializers。它们在 C99 中有效,但在 C++ 中无效。
-
@chris,太好了......所以你要在外部使用定义时编写 struct A { ... } ?现在这确实会更有效率!不是。
-
@jyavenard,我不明白。在标头中定义结构并像您一样通过对象使用它。除了标头之外,没有任何内容与结构本身的定义有关。其他文件宁愿定义结构的成员。
-
@jyavenard:在 C++ 中,如果将结构声明为
struct A {...}(或类似的class A { ... }),则可以在不使用“结构”或“类”的情况下使用它们。如void foo() { A a = ... }。这是从 C 到 C++ 的众多重大变化之一