gpt4 book ai didi

c - 访问 C 结构成员时模拟 "inheritance"

转载 作者:行者123 更新时间:2023-11-30 14:25:26 25 4
gpt4 key购买 nike

我有一个关于 C 的问题,并试图模拟部分类型的“继承”,仅在访问结构成员时。看下面的例子:

#pragma pack(push,1)
typedef struct foo
{
int value;
int value2;
}foo;
typedef struct foo_extended
{
// "inherits" foo
int value;
int value2;
// "inherits" foo stops
//we also have some additional data
float additional;
}foo_extended;
#pragma pack(pop)


//! This function works for both foo types
void workboth(void* objP)
{
foo* obj = (foo*)objP;

obj->value = 5;
obj->value2 = 15;
}

//! This works only for the extended
void workextended(foo_extended* obj)
{
obj->value = 25;
obj->value2 = 35;
obj->additional = 3.14;
}

int main()
{
foo a;
foo_extended b;

workboth(&a);
workboth(&b);
workextended(&b);

return 0;
}

这在我的系统中有效,但我的问题是,只要正确打包所涉及的结构(取决于编译器),这是否可以移植。我想它也需要 #ifndefs 正确调用其他编译器中的紧密包装。

当然,明显的问题是完全缺乏类型检查并将正确使用的所有责任都交给程序员,但我想知道这是否是可移植的。谢谢!

P.S.:忘了提及我试图遵守的标准是 C99

最佳答案

我有一个稍微不同的方法。我没有使用相同的值,而是在结构中创建了一个结构,这样就不需要打包了:

typedef struct foo
{
int value;
int value2;
}foo;

typedef struct foo_extended
{
foo father;
float additional;
}foo_extended;

现在剩下的就和你展示的差不多了,只有一点点不同:

void workextended(foo_extended* obj)
{
obj->father.value = 25;
obj->father.value2 = 35;
obj->additional = 3.14;
}

但我会添加一个 id 作为层次结构中第一个对象的字段,以确保对正确的对象进行转换。

该方法保证可以按照 C 标准工作。

关于c - 访问 C 结构成员时模拟 "inheritance",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10371016/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com