1 C++标准库
C++强大的功能来源于其丰富的类库及库函数资源。C++标准库(C++ Standard Library)的内容总共在50个标准头文件中定义。
由于C++标准库功能强大,包含了众多的类型和函数。所以,标准库与第三方提供的程序库中的类型和函数在名称上可能会发生冲突。通过使用命名空间可以避免这种冲突。
2 命名空间
命名空间是一种特殊的作用域,它包含了出于该作用域中的所有标识符,这样标识符就会被限定在不同的命名空间内。也就是说,即使类型或者函数名称相同,如果它们在不同的命名空间内,就不会发生冲突。
3 C++标准库头文件
C++标准库中所有的类型和函数都被定义在std命名空间中。
3.1 iostream.h与iostream
但是,由于std命名空间出现的时间较晚,在此之前已经有很多C++代码程序都是用了没有std命名空间的“原始”的C++标准库。如果用std命名空间替换“原始”的C++标准库,这样会导致很多程序无法运行。因此,C++标准化委员会设计了一种新的头文件名来解决这个问题,他们把C++头文件中的.h去掉,将这样没有后缀的头文件名分配给那些在std命名空间中定义的C++标准库。而“原始”的C++标准库也能够使用,只是要预防名字冲突问题。
以下的代码效果相同:
#include <iostream.h>
int main()
{
cout << “hello world.\n”;
return 0;
}
和
#include <iostream>
int main()
{
std::cout << “hello world.\n”;
return 0;
}
第一种是“原始”的 C++ 标准库的用法,第二种是 C++ 标准库的用法, std 是 C++ 标准库的命名空间。从以上这个例子看,似乎“原始”的 C++ 标准库还要简单些。但是,正如前面提到的,原始” C++ 标准库中存在名字冲突问题。
#include <iostream.h>
int main()
{
int cout = 0;
cout << “hello world.\n”;
return 0;
}
此时,程序会报错,因为cout 的名字冲突了。而对于使用了 std 命名空间的 C++ 标准库来说:
#include <iostream>
int main()
{
int cout = 0;
std::cout << “hello world.\n”;
return 0;
}
此时,程序正常运行。因为两个cout 变量出于不同的命名空间中。
需要注意的是,从Visual Studio2005开始,已经不支持“原始”的C++标准库。可以在VC++6.0中使用带.h的标准库头文件,但从Visual Studio2005开始往后的版本中,只能使用不带.h的标准库头文件以及std动态库了。
3.2 stdio.h和cstdio
C++标准库的所有头文件都没有扩展名。在C++标准库的50个标准头文件中,有18个提供了C库的功能。同理,提供C库功能的头文件中也使用了std命名空间,其修改的规则是去掉文件的.h后缀名,在其前面加上c。例如stdio.h对应的C++标准库的头文件为cstdio。
#include <stdio.h>
int main()
{
printf(“hello world.\n”);
return 0;
}
和
#include <stdio>
int main()
{
std::printf(“hello world.\n”);
return 0;
}
与“3.1 iostream.h与iostream”中介绍的一样,第一种未使用命名空间std的代码,会存在名称冲突的问题。