我正在使用嵌套结构在普通C中创建一种“结构继承”。例如,我有一些像这样的结构:
struct a {
obj_type type_id;
int x;
int y;
}
struct b {
struct a super;
char* str;
}
struct c {
struct a super;
int* data;
bool flag;
}
然后我创建一个枚举,如下所示:
typedef enum {
OBJ_TYPE_A,
OBJ_TYPE_B,
OBJ_TYPE_C
} obj_type;
这让我可以通过检查它们的type_id
来确定各种对象的结构来模拟继承,然后转换为相应的结构。我的问题是我希望能够初始化这些“子”结构而无需手动定义父结构的x
和y
属性。
基本上,我可以初始化一个像这样的指针:
struct b obj_b = { OBJ_TYPE_B, 0, 0, "foo" };
struct b *ptr_b = malloc(sizeof(struct b));
memcpy(ptr_b, &obj_b, sizeof(struct b));
但是,我宁愿为我做一个a
的初始化函数,所以我可以这样做:
struct b *ptr_b = object_create(OBJ_TYPE_B, { "foo" }, sizeof(struct b));
我已经像这样创建了类似函数的实现:
const struct a DEFAULT_A = { OBJ_TYPE_A, 0, 0 };
struct a object_create(obj_type type, void* data_ptr, size_t size) {
struct a new_obj = malloc(size);
memcpy(new_obj, &DEFAULT_A, sizeof(struct a));
memcpy(new_obj + sizeof(struct a), data_ptr, size - sizeof(struct a));
return new_obj;
}
然而,我无法真正使用它,因为我无法做到这样的事情:
struct b *ptr_b = object_create(OBJ_TYPE_B, &{ "foo" }, sizeof(struct b));
有没有办法创建一种“匿名”数据块传递给函数?或者我是否必须使用宏来完成这项工作?
答案 0 :(得分:3)
你想要的是C99确实可能。例如,上面的工作就是你必须抛弃struct literal:
#include <stdio.h>
struct s {
char *a;
};
void f(struct s *p)
{
printf("%s\n", p->a);
}
int main()
{
f(&(struct s){ "hello world" });
return 0;
}
有关this article中的主题的更多信息:
复合文字产生左值。这意味着您可以获取复合文字的地址,该复合文字是复合文字声明的未命名对象的地址。只要复合文字没有const限定类型,就可以使用指针来修改它。