带有结构的遗留代码,如何进行隐式转换

问题描述 投票:0回答:1

我有带有结构的 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 struct implicit-conversion
1个回答
0
投票

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;
© www.soinside.com 2019 - 2024. All rights reserved.