C++语言引入命名空间(Namespace)这一概念主要是为了避免命名冲突,其关键字为 namespace。
通常一个程序需要多个人开发,但是在开发过程中会遇到一些定义了相同变量,在C语言中就难以区分,在C++中引入了命名空间的方式来解决这个问题。
int flag = 1; //小李声明的变量
bool flag = true; //小韩声明的变量
如上面的代码:如果这样的两个声明放在同一函数的时候,编译器会提出flag变量重新定义的错误。不处理的的话,编译无法通过。下面是引入命名空间解决这类命名冲突的问题。
namespace Li{ //小李的变量声明
int flag = 1;
}
namespace Han{ //小韩的变量声明
bool flag = true;
}
两人以各自的姓氏来定义了命名空间,并在其中声明了flag变量,使用的时候则需要分别用域解析操作符指明此时用的 flag 变量是谁定义出来的 flag 变量,是小韩还是小李定义的。
除了直接使用域解析操作符,还可以采用 using 声明(using declaration)
using Li::flag;//开头using声明了Li::flag。含义是后面没有指明是那个flag的时候,默认是Li::flag
flag = 0; //使用小李定义的变量flag
Han::flag = false; //使用小韩定义的变量flag,在开头声明了是Han的空间
如果命名空间 Li 中还定义了其他的变量,则同样具有 flag 变量的效果,在 using 声明后,若出现未具体指定命名空间的命名冲突变量,则默认采用 Li 命名空间中的变量。
命名空间内部不仅可以声明或定义变量,对于其它能在命名空间以外声明或定义的实体,同样也都能在命名空间内部进行声明或定义,例如变量的声明或定义、函数的声明或定义、typedef 等都可以出现在命名空间中。
#include<iostream>
using namespace std;
int main(){
cout<<"hello world!"<<endl;
return 0;
}
程序中采用了 using 声明命名空间 std,using namespace std;
这一语句涵盖了 std 命名空间中的所有标识符,而该命名空间包含 C++ 所有标准库。头文件 iostream 文件中定义的所有变量、函数等都位于 std 命名空间中,每次使用 iostream 中的变量或函数都需要在前面加上std::
是非常麻烦的一件事,为此可直接用 using 声明将 std 中的所有变量或函数等都声明出来。
如果不用using namespace std;
这一语句,则程序应该像下面这样:
#include<iostream>
int main(){
std::cout<<"hello world!"<<std::endl;
return 0;
}
这样看起来是相当麻烦的,如果在某次使用 iostream 中变量或函数时漏掉 std 则会导致为定义标识符错误。
C++语言是以 C语言为基础的,它继承了所有的 C语言函数库,但 C++ 对这些标准库都重新命名了。标准 C头文件(如 math.h)重命名为 cmath,去掉头文件的.h,并在前面加上c。因此在 C++ 中如需使用 math.h 头文件则可以按照如下方式使用。