举个例子: http://codebase.eu/tutorial/linux-socket-programming-c和 http://codebase.eu/tutorial/linux-socket-programming-c/code/tcpclient.cpp
基本上,第一个示例应用程序使用close()但不包含unistd.h。有些人在评论中提到了这一点。它适用于没有它的人,而其他人则必须包括它。
我的问题是为什么:为什么有时候没必要?总是包括它更好吗?当没有必要包括它时,它意味着什么?
答案 0 :(得分:2)
引用的代码使用<iostream>
。由于它,unistd.h
很可能被包括在内。但是,如果您想使用unistd.h
,则不应指望它自己包含close()
。
答案 1 :(得分:2)
使用#include <unistd.h>
时int close(int);
总是更好,因为这是保证在POSIX平台上编译时源代码的int close(int);
声明可用的唯一方法。在某些情况下,其他包含的文件(或您的构建链)可能包含unistd.h
或包含前向声明。
当C ++预处理器处理您的源代码时,它基本上将#include <something.h>
行替换为预处理的something.h
内容。因此,如果something.h
(或递归其中一个包含的标题)有#include <unistd.h>
行,那么即使您没有直接包含{{1},您的源代码也会看到int close(int);
的声明标题。
但是,为了确保可移植性,如果您使用unistd.h
函数(unistd.h
),请始终包含int close(int);
!
如果要查找可能包含头文件的位置,请参阅this question。同样,您可以使用man 3p close
/ -E
的{{1}}标记输出源代码的完全预处理版本,以找出g++
声明的来源。