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> >甚至不必是真实文件。作为一个旁注,
时,您可以从cstdio
获取内容,但它位于名称空间std中stdio.h
只是澄清:
.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
vsfabs
vsfabs
vsfabsl
)。如果您使用模板,则与#include
不同,而不是其他类型或其他标题