6

我正在尝试将 a 投射struct到另一个。但是我在编译时不断收到此错误:

请求转换为非标量类型

我收到此行的错误:

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)));
};

谁能说出为什么?

4

5 回答 5

12

您不能转换为不同的结构类型。但是,您可以强制转换为指向不同结构类型的指针,这在具有共同起始字段的结构中广泛使用(您的方式)。您可以更改函数以获取指针:

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

然后调用它:

get_info(type, (struct prefix_ipv4 *)&p);
于 2013-09-25T12:16:22.173 回答
5

即使使用显式强制转换,也不能将一种结构类型强制转换为另一种。(插入样板文件对隐式转换构造函数和转换运算符重载感到畏缩。)您可以将结构指针转换为不同的结构指针,这可能是您应该在这里做的;顺便说一句,您还应该通过指针将结构传递给函数。

于 2013-09-25T12:15:35.587 回答
2

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

于 2013-09-25T12:34:35.377 回答
1

p可能是一个指针,错误说您不能将指针转换为结构类型。如果 to 的参数ospf_external_info_delete是一个指针,那么您可以将一个类型指针强制转换为另一个类型指针。

于 2013-09-25T12:19:31.737 回答
0

由于您的数据很少,您应该初始化一个struct prefix_ipv4fromstruct prefix并传递它。

或者使用指针答案,但如果函数原型很容易修改而不会产生影响,我将替换为struct prefix_ipv4struct prefix因为我认为不需要 ipv6 版本可以处理的 ipv4 版本。

于 2013-09-25T14:56:11.853 回答