2016-08-04 76 views
4

根據該男子頁getaddrinfo(3),我需要爲什麼包含一個POSIX函數的多個頭文件?

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

使用的功能getaddrinfo。或者,根據the standard

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

我明白我需要的東西像<sys/socket.h>AF_INETSOCK_STEAM。但我仍然有以下問題。

假設我將只使用getaddrinfo函數,我必須要#include <sys/socket.h>是標準符合嗎?如果是這樣,爲什麼不<netdb.h>包括它本身?如果沒有,爲什麼手冊頁將它包含在大綱中?

回答

5

您需要能夠以有意義的方式撥打getaddrinfo的唯一標頭是netdb.h。一個示例用例將循環播放結果,並調用getnameinfo,每個用NI_NUMERICHOST以打印主機名解析的數字地址。這不需要netdb.h以外的任何接口。

但是,如果你想限制你的查詢到一個特定的地址系列,你需要定義地址系列常量的標題(sys/socket.h)。您通常也希望使用結果來製作合適的套接字和打開的連接,這也需要sys/socket.h。推測該標題包含在說明書中的原因是它需要訪問全部(而不僅僅是一些)的功能getaddrinfo所提供的。

至於sys/types.h,我認爲這只是Linux man手冊中的一個漏洞。一般sys/types.h永遠不應該使用,除非你處於這種情況,你只是想要類型定義沒有拉入宏常量和函數原型。

+3

在舊版本的POSIX(那些來自上一個千年,而不是這個),''大多數地方需要。 POSIX 2004升級了一些東西,所以你很少或永遠不需要再包含它。這是'殘酷',但它有一個歷史性的理由。 –

+0

@JonathanLeffler:你有這個引用嗎? –

+0

例如:['getgid()'1997](http://pubs.opengroup.org/onlinepubs/7990989775/xsh/getgid.html); ['getgid()'2004](http://pubs.opengroup.org/onlinepubs/009695399/functions/getgid.html)。可能有某處指明它的地方 - 我最近沒有找過它。 –

相關問題