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

Qia*_*ian 4 c standards posix header-files

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

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
Run Code Online (Sandbox Code Playgroud)

使用该功能getaddrinfo.或者,根据标准:

#include <sys/socket.h>
#include <netdb.h>
Run Code Online (Sandbox Code Playgroud)

我明白我需要的东西像AF_INETSOCK_STEAM<sys/socket.h>.但我仍然有以下问题.

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

R..*_*R.. 5

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

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

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

  • 在旧版本的POSIX(来自上一个千年,不是这个版本)中,大多数地方都需要``sys/types.h>`.POSIX 2004对事物进行了升级,以便您很少或根本不需要再将其包含在内.这是"残酷的",但它有一个历史原因在那里. (3认同)