我可以’扩展’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;