为什么要为一个POSIX函数包含多个标题?

时间:2016-08-04 03:24:28

标签: c posix standards header-files

根据手册页getaddrinfo(3),我需要

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

使用函数getaddrinfo。或者,根据the standard

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

我理解我需要来自AF_INET的{​​{1}}和SOCK_STEAM等内容。但我仍然有以下问题。

假设我只使用<sys/socket.h>函数,我必须getaddrinfo符合标准吗?如果是这样,为什么#include <sys/socket.h>不包括它?如果没有,为什么手册页会在概要中包含它?

1 个答案:

答案 0 :(得分:5)

您需要能够以有意义的方式致电getaddrinfo的唯一标头是netdb.h。一个示例用例是循环结果并在每个getnameinfo上调用NI_NUMERICHOST,以便打印主机名解析的数字地址。这不需要netdb.h之外的任何接口。

但是,如果要将查询限制为特定的地址系列,则需要定义地址族常量(sys/socket.h)的标头。您通常还希望使用结果来生成合适的套接字和打开的连接,这也需要sys/socket.h。据推测,此标头包含在规范中的原因是需要访问所有(而不仅仅是某些)所提供的功能{。}}。

至于getaddrinfo,我认为这只是Linux手册页中的瑕疵。一般情况下,永远不应该使用sys/types.h,除非您处于只需要类型定义而不需要拉入宏常量和函数原型的情况。