C++ 为什么有些代码文件使用close()而不包含unistd.h?
举个例子: 和 基本上,第一个示例应用程序使用close(),但不包括unistd.h。一些人在评论中提到了这一点。它适用于一些没有它的人,而其他人必须包括它C++ 为什么有些代码文件使用close()而不包含unistd.h?,c++,gcc,g++,C++,Gcc,G++,举个例子: 和 基本上,第一个示例应用程序使用close(),但不包括unistd.h。一些人在评论中提到了这一点。它适用于一些没有它的人,而其他人必须包括它 我的问题是为什么会这样:为什么有时候没有必要?总是包含它更好吗?当不需要包含它时,它意味着什么?引用的代码使用。很可能,unistd.h因此而被包括在内。但是如果您想使用close(),引用的代码使用,则不应指望它,而应包括unistd.h。很可能,unistd.h因此而被包括在内。但是如果你想使用close()的话,你不应该指望它,而
我的问题是为什么会这样:为什么有时候没有必要?总是包含它更好吗?当不需要包含它时,它意味着什么?引用的代码使用
。很可能,unistd.h
因此而被包括在内。但是如果您想使用close()
,引用的代码使用
,则不应指望它,而应包括unistd.h
。很可能,unistd.h
因此而被包括在内。但是如果你想使用close()
的话,你不应该指望它,而应该自己包含unistd.h
,在使用int close(int)时最好包含因为这是保证int close(int)声明的唯一方法在POSIX平台上编译时,代码>将可用于源代码。在某些情况下,其他包含的文件(或您的构建链)可能包含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)声明的唯一方法在POSIX平台上编译时,代码>将可用于源代码。在某些情况下,其他包含的文件(或您的构建链)可能包含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
(早期标准使用了不同的