我有带有结构的 C 遗留代码。看起来像这样:
typedef struct data
{
int a;
} data;
typedef struct user
{
data d;
} user;
data* get(user* u){return &u->d};
现在我想扩展数据而不触及它。为此,我引入了一个新结构:
typedef struct newDataType
{
int a;
int b;
} newDataType;
typedef struct user
{
newDataType d;
} data;
有没有办法进行转换,以便
get()
可以在不改变它的情况下使用:
data* d1 = get(u);
newDataType* d2 = get(u);
通过这个测试代码,我得到
return': cannot convert from 'newDataType *' to 'data *'
:
void func()
{
user u;
data* d1 = get(&u);
newDataType* d2 = get(&u);
}
我可以改变
user
和newDataType
。
C 中的继承通常与 C++ 中的继承方式相同。编译器对它的控制稍微少一点:
typedef struct {
int a;
} data;
typedef struct {
data d;
int b;
} newData;
typedef struct
{
newData nd;
} user;
// And you now have an old structure available for work as it was
data* get(user* u){ return &u->nd->d; }
// The next two functions are equivalent.
// Just ensure that inherited member is a first one.
data* get(user* u){return (data*)&u};
data* get(user* u){return (data*)&u->nd};
如果您不想(或无法)更改
get()
函数,您可以更改 data
结构。
如果
data
和 get()
都已锁定,但您仍想扩展 user
结构,那么就这样做:
typedef struct
{
data d;
newData nd;
} user;