C 为什么getaddrinfo需要3个标题?

C 为什么getaddrinfo需要3个标题?,c,linux,sockets,unix,networking,C,Linux,Sockets,Unix,Networking,每当我看到使用getaddinfo()时,我都会看到它附带3个标题: #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #包括 #包括 #包括 此外,将此函数与其他2个函数一起分组,并列出相同的3个标题。为什么getaddrinfo()似乎需要3个标题——或者至少,我们如何确定函数实际上需要哪些标题?正如您在问题中引用的文档一样,答案是您应该始终编码接口的文档化方式。由于有文

每当我看到使用
getaddinfo()
时,我都会看到它附带3个标题:

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

此外,将此函数与其他2个函数一起分组,并列出相同的3个标题。为什么
getaddrinfo()
似乎需要3个标题——或者至少,我们如何确定函数实际上需要哪些标题?

正如您在问题中引用的文档一样,答案是您应该始终编码接口的文档化方式。由于有文件规定需要这三个头,因此在使用接口时应包括这些头

至于细节,在
头文件中定义了
getaddrinfo()
API,但是该头文件定义了一些依赖于
的其他结构和API,而
依赖于


您可能认为这很愚蠢,但它至少有文档记录,并且您知道在哪里可以找到文档。因此,解决这些依赖关系比在具有此类依赖关系但无法记录它们的项目中要容易得多。对于文档记录不完整的系统(甚至文档记录良好的系统),通常更容易使用自包含的头文件,但UNIX和Linux是非常古老和稳定的系统,它们往往遵循“未损坏,不会修复”规则。

尝试删除一些头文件,并查看代码是否编译。(a)因为它们都是必需的。(b) 请参阅(a)。其他两个可能是针对
struct addrinfo
的一些成员,如
struct sockaddr
。由于
struct addrinfo
包含指向
struct sockaddr
的指针,它可以将其视为标头中的不完整类型,因此标头不需要包含
sys/socket.h
,即使实现文件必须包含。但是如果
netdb.h
没有,那么您必须包含
sys/socket.h
才能处理这样的东西。为什么
不包含这两个标题呢?“未损坏,不会修复”规则。