将一个结构体转换为另一个结构体

7
我试图将一个struct转换为另一个struct。但是编译时我一直收到以下错误提示:
conversion to non-scalar type requested

我在此行代码中遇到了这个错误:

p是一个结构体前缀,我需要将它转换为struct prefix_ipv4

 get_info (type, (struct prefix_ipv4) p);

代码:

ospf_external_info_delete (u_char type, struct prefix_ipv4 p)
{
///////////////
}

struct prefix_ipv4
{
  u_char family;
  u_char prefixlen;
  struct in_addr prefix __attribute__ ((aligned (8)));
}

struct prefix
{
  u_char family;
  u_char prefixlen;
  union 
  {
    u_char prefix;
    struct in_addr prefix4;

    struct in6_addr prefix6;

    struct 
    {
      struct in_addr id;
      struct in_addr adv_router;
    } lp;
    u_char val[8];
  } u __attribute__ ((aligned (8)));
};

有人能说出原因吗?

5个回答

12

你不能将一个结构体类型强制转换为另一种结构体类型。不过,你可以将其强制转换为指向另一种结构体类型的指针,这在具有相同起始字段的结构体中广泛使用(就像你的结构体一样)。你可以修改函数以接受一个指针:

void get_info(..., struct prefix_ipv4 *prefix)
...

然后调用它:

get_info(type, (struct prefix_ipv4 *)&p);

5

即使使用显式转换,也不能将一个结构体类型强制转换为另一个结构体类型。(插入关于隐式转换构造函数和转换操作符重载的陈词滥调。)您可以将一个结构体指针转换为另一个结构体指针,这可能是您应该在这里做的;顺便说一下,您还应该通过指针将您的结构体传递给函数。


2
您可能想要查看C语言中的 'union' 关键字。它允许您为同一块内存提供替代声明。

1

p 可能是指针,错误提示说你不能将指针转换为结构体类型。如果传递给 ospf_external_info_delete 的参数是指针,则可以将一种类型的指针转换为另一种类型的指针。


0

由于您的数据量很少,因此您应该从struct prefix初始化一个struct prefix_ipv4并传递它。

或者选择指针答案,但在函数原型容易修改而不会产生影响的情况下,我会将struct prefix_ipv4替换为struct prefix,因为我认为ipv6版本可以处理ipv4版本的所有需求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接