我正在试图找出一种方法来强制转换两个类型,这两个类型具有相同的字段,但顺序不同(甚至有些字段丢失),而不需要复制。
例如,如果我们有以下结构:
typedef struct Foo {
int age;
float height;
char* name;
} Foo;
typedef struct Bar {
float height;
float weight;
char* name;
int age;
} Bar;
有没有什么方法可以将Bar转换成Foo,而不必制作中间副本?
Bar bar;
Foo foo;
bar = foo;
此外,是否有可能通过指针强制转换来实现此操作?
Bar *bar;
Foo foo;
bar = &foo
提前谢谢! 问好,萨尔瓦
不。
那些是不相关的类型。
您可以将数据从第一个对象复制到第二个对象中,或者,在某些有限的情况下,使用一些指针魔术来假装第一个对象具有第二个对象的类型。 这不是其中一个案例。
幸运的是,复制int和float很便宜,而且根据您的情况,可能实际上在运行时不涉及任何活动(编译器很聪明!)。
不是直接那样。 不能使类型的指针指向不相关的类型,这将违反别名规则。
如果两种类型都有一个公共的初始序列,则可以使用union来执行此操作。 但是,您不具备:某些第一个成员的类型不相同。
下面是一个具有公共初始序列的结构示例:
struct Foo {
char const* name;
int age;
float height;
};
struct Bar {
char const* name;
int age;
float height;
float weight;
};
union Foobar {
Foo foo;
Bar bar;
};
auto const foobar = Foobar{Bar{}};
// can access foo even though bar is initialized.
// a whole foo is a common initial sequence of bar.
Foo const* foo = foobar.foo;
您也可以简单地将公共成员放在父类中:
struct common {
char const* name;
int age;
float height;
};
struct Foo : common {
// whatever
};
struct Bar : common {
// whatever
};