我可以’扩展’C中的结构吗?

typedef struct foo_s { int a; } foo; typedef struct bar_s { foo; int b; } bar; 

基本上我想做:

 bar b; ba; 

我知道如果我在bar中命名了foo结构,我可以做b.foo_name.a,但我不想这样做。

有什么办法吗?

这个问题得到了各种不同的答案,所以让我解释一下这个问题。 我想这样做的原因是因为我有一个我需要适应我的情况的库,这意味着我无法修改原始的struct decleration。 此外,我需要做的是在结构的开头添加1项(为什么开始?因为我有一个’对象’结构,它负责项目中的所有结构)。 我可以像你提到的那样简单地嵌入结构但它真的很烦人,因为所有的引用都需要输入’variable-> image.location’那个’image’。 键入十亿种类型真的很烦人。

显然这个function已被添加到C11中 ,但是我无法访问最近年份的C编译器(> = GCC 4.6.2)。

 typedef struct foo { int a; } foo; typedef struct bar { struct foo; int b; } bar; int main() { bar b; ba = 42; bb = 99; return 0; } 

您可以使用指针,因为保证指向结构对象的指针指向其第一个成员。 参见例如本文 。

 #include  #include  typedef struct foo_s { int a; } foo; typedef struct bar_s { foo super; int b; } bar; int fooGetA(foo *x) { return x->a; } void fooSetA(foo *x, int a) { x->a = a; } int main() { bar* derived = (bar*) calloc(1, sizeof(bar)); fooSetA((foo*) derived, 5); derived->b = 3; printf("result: %d\n", fooGetA((foo*) derived)); return 0; } 

不可能像你那样用C 。 但是你可以模仿在bar中有foo成员变量的inheritance。

 typedef struct bar_s { foo obj; int b; } bar; bar b; b.obj.a = 10; 

如果你的话

 typedef struct foo_s { int a; } foo; typedef struct bar_s { foo my_foo; int b; } bar; 

所以你可以这样做:

 bar b; b.my_foo.a = 3; 

否则,由于sizeof(bar_s)对编译时间不利,因此无法在C中执行此操作。 这不是一个好习惯,但你可以节省void * ptr; bar_s中的指针,以及描述ptr类型的另一个枚举,并由类型转换。

即:

 typedef enum internalType{ INTERNAL_TYPE_FOO = 0, }internalType_t; typedef struct bar_s { internalType_t ptrType; void* ptr; int b; } bar; 

然后:

 bar b; foo f; b.ptrType = INTERNAL_TYPE_FOO; b.ptr = &f; 

以及代码中的其他地方:

  if (b.ptrType == INTERNAL_TYPE_FOO) { foo* myFooPtr = (foo *)b.ptr; } 

您可以尝试使用inheritance:

 struct foo_s { int a; }; struct bar_s: foo_a { int b; }; 

在C ++中工作,不确定它是否在C中工作。

它可以通过预处理器轻松完成:

创建一个名为base_foo.h的文件:

 int foo; 

然后简单地包括它:

 typedef struct foo_s { #include "base_foo.h" } foo; typedef struct bar_s { #include "base_foo.h" int b; } bar;