【问题标题】:Storage Size of addrinfo isn't knownaddrinfo 的存储大小未知
【发布时间】:2016-05-31 09:33:09
【问题描述】:

我正在用 C 编写一个简单的网络程序。当我用 --std=c11 打开 -Wall 时,我收到一条关于声明结构方式的错误消息。

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>


int main() {

        struct addrinfo res;

    return 0;
}

addrinfo 类型在 sys/types.h 文件中定义。使用指针时不会出错。

如何解决此错误消息?

simple.c:9:25: error: storage size of ‘res’ isn’t known
         struct addrinfo res;
                         ^

【问题讨论】:

  • man 2 bind: 为 addr 参数传递的实际结构将取决于地址族。 sockaddr 结构定义为: struct sockaddr { sa_family_t sa_family;字符 sa_data[14];此结构的唯一目的是转换在 addr 中传递的结构指针以避免编译器警告。 您不会创建 struct sockaddr 类型的对象以供正常使用,而是创建适当的对象子类型,struct sockaddr_in 用于 ipv4,例如。

标签: c networking


【解决方案1】:

几点:

  1. addrinfo 类型实际上是在netdb.h 中定义的。
  2. 您可以使用gcc-E 标志来查看预处理器输出并发现addrinfo 结构实际上没有在您的代码中定义。现在您应该怀疑可能缺少某些定义。
  3. 可以看到here,为了暴露定义你需要使用_POSIX_C_SOURCEfeature test macro
  4. 因此,这应该可以解决上述错误消息:

    #define _POSIX_C_SOURCE 200112L
    
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netdb.h>
    
    int main() {
        struct addrinfo res;
    
        return 0;
    }
    

【讨论】:

  • 谢谢,这是完美的。 -E 看起来真的很有用
  • 很高兴我能帮上忙 :-)。
猜你喜欢
  • 1970-01-01
  • 2017-07-24
  • 1970-01-01
  • 2022-07-08
  • 2019-06-30
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
相关资源
最近更新 更多