Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.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++ 为什么有些包含需要.h而其他不需要?_C++_Include - Fatal编程技术网

C++ 为什么有些包含需要.h而其他不需要?

C++ 为什么有些包含需要.h而其他不需要?,c++,include,C++,Include,为什么地图导入为#include,而stdio导入为#include?它只是磁盘上实际文件的名称。您的标准include目录中(可能)没有名为map.h或stdio的文件 C++标准库在使用文件名的结尾时,不使用以前的使用代码< >代码> h >代码>不具有 .h 。这可能与使语法看起来更像模板有关: #include<vector> vector<int> v; #包括 向量v; (先发制人的评论:是的,我知道上面需要代码> STD::/Cudio>要构建,但它

为什么地图导入为
#include
,而stdio导入为
#include

它只是磁盘上实际文件的名称。您的标准include目录中(可能)没有名为
map.h
stdio
的文件

C++标准库在使用文件名的结尾时,不使用以前的使用代码< >代码> h >代码>不具有<代码> .h <代码>。这可能与使语法看起来更像模板有关:

#include<vector>

vector<int> v;
#包括
向量v;

(先发制人的评论:是的,我知道上面需要代码> STD::/Cudio>要构建,但它只是一个例证。)

< P>这只是C++标准所定义的方式——正如它发生的那样,<代码> MAP>代码>和<代码> STDIO .H./C> >甚至不必是真实文件。

作为一个旁注, Sdidi.H./Cuth>是从C标准库最初导入C++的头——C++版本是Cudith>CSTDIO 。实际上,这通常意味着当您包含

cstdio
时,您可以从
stdio.h
获取内容,但它位于名称空间std中


只是澄清: Stdio.H./Cuth> C++中包含C++原本是C首标的版本。但是C++编写C++的方式是:代码> CSTDIO < /C>。我在某个地方读到这样一个概念,即它们不需要是实际的文件,即使我从未见过一个实现以另一种方式执行它编辑:实际上,编译器内部函数应该考虑到包含的头文件,但实际上不包括作为文件的头文件;见@Yttrill的评论

<> >对于代码> STDIO .H./Cuth>,在C++应用程序中不应该包含<代码> <代码>,但应该包括<代码> <代码>。一般来说,您不应该包含“普通”C头,但是它们的C++化对应项(最终没有
.h
)前面有一个
C
,并将其中定义的所有符号放在
std
名称空间中。所以,
变成
变成
,依此类推

一般来说,你应该使用C++标题的C++版本来避免污染全局命名空间(假设你不是那些使用NoStESTSTD;到处放代码>的家伙之一,并受益于C++标准头的一些C++改进(例如,添加到一些数学函数的重载)。


一般来说,整个过程的实现只需在编译器查找头文件的目录中包含这些没有扩展名的文件即可。例如,在我的g++4.4安装中,您有:

matteo@teoubuntu:/usr/include/c++/4.4$ ls
algorithm           cstdarg              functional        sstream
array               cstdatomic           initializer_list  stack
backward            cstdbool             iomanip           stdatomic.h
bits                cstddef              ios               stdexcept
bitset              cstdint              iosfwd            streambuf
c++0x_warning.h     cstdio               iostream          string
cassert             cstdlib              istream           system_error
ccomplex            cstring              iterator          tgmath.h
cctype              ctgmath              limits            thread
cerrno              ctime                list              tr1
cfenv               cwchar               locale            tr1_impl
cfloat              cwctype              map               tuple
chrono              cxxabi-forced.h      memory            typeinfo
cinttypes           cxxabi.h             mutex             type_traits
ciso646             debug                new               unordered_map
climits             deque                numeric           unordered_set
clocale             exception            ostream           utility
cmath               exception_defines.h  parallel          valarray
complex             exception_ptr.h      queue             vector
complex.h           ext                  random            x86_64-linux-gnu
condition_variable  fenv.h               ratio
csetjmp             forward_list         regex
csignal             fstream              set
理论上,C++化的C头可能只是一个

namespace std
{
#include <original_C_header.h>
};
名称空间std
{
#包括
};
但一般来说,它们在处理特定于实现的问题(特别是关于宏)和添加与C++相关的功能方面更为复杂(例如,请参见前面在
中添加重载的示例)


顺便说一下,C++标准(<D.5)并没有说<<代码> <代码>标题应该表现得好像在<代码>命名空间STD 指令中包含<代码> <代码>标题,但相反:

< >与标准C库兼容,C++标准库提供18个C标题… 每个C标头(其名称的格式为name.h)的行为就好像由相应的cname标头放置在标准库命名空间中的每个名称也被放置在名称空间std的命名空间范围内,后面跟着一个显式的using声明(7.3.3)

请注意,此类标题被视为已弃用(§C.2.1),因此这是您不应使用它们的主要原因:

C.2.1标题修改 为了与标准C库兼容,C++标准库提供了18个C标题(D.5), 但是它们的使用在C++中被禁止。
stdio也可以作为
#include
@Matt:导入,因此导入名称与文件名不同。如何做到这一点?@Casebach:通常有两个独立的文件,
cstdio
stdio.h
,其中
cstdio
包括
stdio.h
,将其所有符号放在名称空间std中。但具体方式取决于实现。@Casebash:不,实际上有一个文件
cstdio
(或者至少是编译器所知道的伪文件),它定义了标准的C++库函数,这些函数几乎等同于标准C库标题“代码> STDIO .H./COD>”。@ Ben:它们可能不只是包含C标题,而是在流行的编译器上(我在MSVC之前检查了我的代码> CSTDIO < /Cord>头)尽管如此,它们还是包含了它们。尽管你的观点很有趣。我不想对一个相互竞争的答案投反对票,但这实际上是不准确的——不能保证文件
map
stdio.h
存在于磁盘上。没错,也不能保证。大多数编译器将标准库头存储为fi不过,磁盘上的les——当然是流行的常用的。当然——这是显而易见的实现选择。我没有投反对票,只是想观察“它只是磁盘上实际文件的名称”由于标准的Mac没有提供任何理由来使用C++标准头的C++版本,所以我给出一个:C++头通常提供C标准库函数的重载版本,这些函数对于参数的实际数据类型进行了优化。也有多个版本,但它们都有不同的名称(例如,
abs
vs
fabs
vs
fabs
vs
fabsl
)。如果您使用模板,则与
#include
不同,而不是其他类型或其他标题