STL
C++ 中的 STD 指的是什么
std 的由来
在标准 C++ 以前,都是用
#include<iostream.h>
这样的写法的,因为要包含进来的头文件名就是iostream.h
。
标准 C++ 引入了名字空间的概念,并把iostream
等标准库中的东东封装到了std
名字空间中,
同时为了不与原来的头文件混淆,规定标准 C++ 使用一套新的头文件,这套头文件的文件名后不加.h
扩展名,如iostream
、string
等等,
并且把原来 C 标准库的头文件也重新命名,如原来的string.h
就改成cstring
(就是把.h
去掉,前面加上字母c
),所以头文件包含的写法也就变成了#include <iostream>
。
并不是写了#include<iostream>
就必须用using namespace std
; 我们通常这样的写的原因是为了一下子把 std 名字空间的东东全部暴露到全局域中(就像是直接包含了 iostream.h 这种没有名字空间的头文件一样),使标准 C++ 库用起来与传统的iostream.h
一样方便。
如果不用using namespace std
, 使用标准库时就得时时带上名字空间的全名,如std::cout << "hello" << std::endl
;
#include "iostream"
与 #include<iostream>
的区别
前者先在当前目录找
iostream
文件,找不到再去系统头文件路径找,后者反之。
因此,做为一个良好的习惯,在包含系统头文件时尽量用<>
,而在包含自己的工程中的头文件时用""
。
且<iostream>
和<iostream.h>
文件是不一样(前者没有后缀),实际上,在编译器#include
文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。
后缀为.h
的头文件 C++ 标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h
后缀的头文件里,c++ 标准为了和 C 区别开,也为了正确使用命名空间,规定头文件不使用后缀.h
。
因此,当使用<iostream.h>
时,相当于在 C 中调用库函数,使用的是全局命名空间,也就是早期的 C++ 实现;
当使用<iostream>
的时候,该头文件没有定义全局命名空间,必须使用namespace std
;这样才能正确使用cout
。