为什么有些代码文件使用close()而不包括unistd.h?

时间:2014-08-09 08:07:10

标签: c++ gcc g++

举个例子: http://codebase.eu/tutorial/linux-socket-programming-chttp://codebase.eu/tutorial/linux-socket-programming-c/code/tcpclient.cpp

基本上,第一个示例应用程序使用close()但不包含unistd.h。有些人在评论中提到了这一点。它适用于没有它的人,而其他人则必须包括它。

我的问题是为什么:为什么有时候没必要?总是包括它更好吗?当没有必要包括它时,它意味着什么?

2 个答案:

答案 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++声明的来源。