C++语言引入命名空间(Namespace)这一律念主要是为了不命名冲突,其关键字为 namespace。
科技发展到现在,一个系统一般都不会仅由一我的来开发完成,不一样的人开发同一个系统,不可避免地会出现变量或函数的命名冲突,当全部人的代码测试经过,没有问题时,将全部人的代码结合到一块儿,由于变量或函数重名而致使的问题将会形成必定的混乱,例如:
ios
int flag = 1; //小李声明的变量 // …… //中间间隔若干行代码 bool flag = true; //小韩声明的变量
注意:此例仅为解释命名空间所用,在公司的系统开发中并不是如此中所述,彻底仅靠命名空间来解决命名冲突的,具体编程规范能够参考林锐的《高质量程序设计指南》一书。
如上所示,由于我的习惯不一样,小李喜欢声明int型变量用于逻辑判断,而小韩则更喜欢采用bool类型变量。但两个声明放到同一个函数中的时候,很明显编译器会提示出flag变量从新定义的错误。这种问题若不加以处理是没法编译经过的。
可使用命名空间解决相似上面的命名冲突问题,例如:
编程
namespace Li{ //小李的变量声明 int flag = 1; } namespace Han{ //小韩的变量声明 bool flag = true; }
小李与小韩各自定义了以本身姓氏为名的命名空间,此时将小李与小韩的flag变量定义再置于同一个函数体中,则不会有任何问题,固然在使用这两个变量的时候须要指明所采用的是哪个命名空间中的flag变量。
指定所使用的变量时须要用到“::”操做符,“::”操做符是域解析操做符。例如:
函数
Li::flag = 0; //使用小李定义的变量flag Han::flag = false; //使用小韩定义的变量flag
咱们已经定义了两个命名空间 Li 和 Han,并在其中各自声明flag变量,使用的时候则须要分别用域解析操做符指明此时用的flag变量是谁定义出来的flag变量,是小韩仍是小李定义的。
除了直接使用域解析操做符,还能够采用using声明(using declaration),例如:
测试
using Li::flag; flag = 0; //使用小李定义的变量flag Han::flag = false; //使用小韩定义的变量flag
在代码的开头用using声明了Li::flag,其含义是using声明之后的程序中若是出现未指明的flag时,则使用Li::flag,可是若要使用小韩定义的flag,则仍须要Han::flag。
using声明不只仅能够针对命名空间中的一个变量,也能够用于声明整个命名空间,例如:
spa
using namespace Li; flag = 0; //使用小李定义的变量flag Han::flag = false; //使用小韩定义的变量flag
若是命名空间Li中还定义了其余的变量,则一样具备flag变量的效果,在using声明后,若出现未具体指定命名空间的命名冲突变量,则默认采用Li命名空间中的变量。
命名空间内部不只能够声明或定义变量,对于其它能在命名空间之外声明或定义的实体,一样也都能在命名空间内部进行声明或定义,例如变量的声明或定义、函数的声明或定义、typedef等均可以出如今命名空间中。
下面咱们来看一个简单的C++程序的示例:设计
#include<iostream> using namespace std; int main(){ cout<<"hello world!"<<endl; return 0; }
这是一个简单的C++程序hello world示例,在程序中采用了using声明命名空间std,using namespace std; 这一语句涵盖了std命名空间中的全部标识符,而该命名空间包含C++全部标准库。头文件iostream文件中定义的全部变量、函数等都位于std命名空间中,每次使用iostream中的变量或函数都须要在前面加上std::是很是麻烦的一件事,为此可直接用using声明将std中的全部变量或函数等都声明出来。
若是不用using namespace std;这一语句,则程序应该像下面这样:
code
#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头文件则能够按照以下方式使用。blog
#include<cmath> using namespace std;
如下的 是个人简单的工程代码继承
namespace 头文件的代码ip
#ifndef NAMESPACE_H #define NAMESPACE_H namespace Li{ //小李的变量声明 int flag = 1; } namespace Han{ //小韩的变量声明 bool flag = true; } #endif // NAMESPACE_H
主函数的代码
#include <iostream> #include "namespace.h" using namespace std; using namespace Li; int main(int argc, char *argv[]) { cout << Li::flag << endl; Li::flag = 9; cout << Li::flag << endl; return 0; }
输出的结果是