Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么有些代码文件使用close()而不包含unistd.h?_C++_Gcc_G++ - Fatal编程技术网

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

C++ 为什么有些代码文件使用close()而不包含unistd.h?,c++,gcc,g++,C++,Gcc,G++,举个例子: 和 基本上,第一个示例应用程序使用close(),但不包括unistd.h。一些人在评论中提到了这一点。它适用于一些没有它的人,而其他人必须包括它 我的问题是为什么会这样:为什么有时候没有必要?总是包含它更好吗?当不需要包含它时,它意味着什么?引用的代码使用。很可能,unistd.h因此而被包括在内。但是如果您想使用close(),引用的代码使用,则不应指望它,而应包括unistd.h。很可能,unistd.h因此而被包括在内。但是如果你想使用close()的话,你不应该指望它,而

举个例子: 和

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


我的问题是为什么会这样:为什么有时候没有必要?总是包含它更好吗?当不需要包含它时,它意味着什么?

引用的代码使用
。很可能,
unistd.h
因此而被包括在内。但是如果您想使用
close()
,引用的代码使用
,则不应指望它,而应包括
unistd.h
。很可能,
unistd.h
因此而被包括在内。但是如果你想使用
close()

的话,你不应该指望它,而应该自己包含
unistd.h
,在使用
int close(int)时最好包含
int close(int)声明的唯一方法将可用于源代码。在某些情况下,其他包含的文件(或您的构建链)可能包含
unistd.h
,或者包含它的转发声明

当C++预处理器处理源代码时,它基本上替换了<<代码>包含<>代码>行>预处理的内容>代码>某处。因此,如果
something.h
(或递归地包含其中一个标题)有一行
#include
,那么您的源代码将看到
int close(int)的声明
即使您没有直接包含
unistd.h
标题

但是,为了确保可移植性,如果使用
int close(int),请始终包括
unistd.h
功能(
man 3p关闭


查看是否要查找头文件可能包含在何处。类似地,您可以使用
g++
/
clang++
-E
标志来输出源代码的完全预处理版本,以找出
int close(int)声明的位置
来自。

使用
int close(int)时,最好包含
int close(int)声明的唯一方法将可用于源代码。在某些情况下,其他包含的文件(或您的构建链)可能包含
unistd.h
,或者包含它的转发声明

当C++预处理器处理源代码时,它基本上替换了<<代码>包含<>代码>行>预处理的内容>代码>某处。因此,如果
something.h
(或递归地包含其中一个标题)有一行
#include
,那么您的源代码将看到
int close(int)的声明
即使您没有直接包含
unistd.h
标题

但是,为了确保可移植性,如果使用
int close(int),请始终包括
unistd.h
功能(
man 3p关闭


查看是否要查找头文件可能包含在何处。类似地,您可以使用
g++
/
clang++
-E
标志来输出源代码的完全预处理版本,以找出
int close(int)声明的位置来自。

始终需要包含包含要使用的函数声明的文件。另一个包含的文件可能也包含这个,但您不能指望它。此外,它可能会工作,因为编译器会自动生成声明-未显式声明的函数会被编译器自动假定为具有
int-fun(…)
原型-如果原始函数返回指针,并且您所在的平台
sizeof(void*)!=SigeOf(int) .DANIELKAMILKZZAR,自动假设是C,C++不这样做。当然,当然。我没有看到
c++
标记。始终需要包含包含要使用的函数声明的文件。另一个包含的文件可能也包含这个,但您不能指望它。此外,它可能会工作,因为编译器会自动生成声明-未显式声明的函数会被编译器自动假定为具有
int-fun(…)
原型-如果原始函数返回指针,并且您所在的平台
sizeof(void*)!=SigeOf(int) .DANIELKAMILKZZAR,自动假设是C,C++不这样做。当然,当然。我没有看到
c++
标记。这个答案有误导性:包含POSIX标准库头不能保证该头中声明的所有函数都可用。POSIX还要求在包含第一个标准库头之前定义宏(有多个选项)。作为一个简单的例子, > DPROTFF < /C>不总是通过简单地包含<代码> /COD>来声明,因为在这种情况下,ISO C++不允许声明它,所以实现在ISO C++兼容模式下不需要声明它。除非也定义了所需的POSIX宏。@hvd您能发布一个引用和一个例子吗?我没有一个具体的例子,在没有正确的宏定义的情况下包含
无法声明
close()
,但我确实有一个引用:它在SUSv4中,在“特性测试宏”
\u POSIX\u C\u SOURCE
:“符合POSIX标准的应用程序应确保在包含任何标题之前定义特性测试宏
\u POSIX\u C\u SOURCE
。”下面对
\u XOPEN\u SOURCE
(早期标准使用了不同的