【问题标题】:incompatible types when a function returns a union函数返回联合时的不兼容类型
【发布时间】:2015-01-13 13:17:59
【问题描述】:

这里是代码片段:

ip.h

typedef union _ip_t{
    struct _dot_ip {
        unsigned char f4;
        unsigned char f3;
        unsigned char f2;
        unsigned char f1;   //the first field
    }dot_ip;
    unsigned int int_ip;
}ip_t;

ip.c

ip_t
get_mask(int sub_len)
{
    assert(sub_len > 0 || sub_len < 32);
    ip_t ret;
    ret.int_ip = ~((1 << (32 - sub_len)) - 1);
    return ret;
}

main.c

ip_t mask;
mask = get_mask(24);

然后是错误:

错误:从类型“int”分配给类型“ip_t”时类型不兼容

mask = get_mask(24);

我不知道哪里错了,任何帮助将不胜感激

PS:gcc 版本:gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2

【问题讨论】:

  • 这里没问题ideone.com/hrcOCE
  • 请注意,以下划线字符开头的标识符是为实现保留的,不应在您自己的代码中使用。
  • 感谢剩余的@5gon12eder

标签: c


【解决方案1】:

main.c 中看不到您的函数声明。在main.c 中,编译器完全不知道该函数。您的编译器假定它返回int。其余的如下。

编译器的这种行为是 C89/90 特定的。它已在 C99 语言规范中被取缔。现代 C 编译器不应该让您调用未声明的函数。

get_mask 函数的原型添加到ip.h

ip_t get_mask(int sub_len);

告诉编译器get_mask实际上返回ip_t

由于您使用的是gcc,我怀疑编译器实际上发出了一条额外的诊断消息,通知您get_mask 未声明。您是否忽略了该消息?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 2020-02-19
    • 1970-01-01
    • 2016-02-01
    • 2021-04-15
    • 1970-01-01
    相关资源
    最近更新 更多