像这样导致命名冲突的情况还有很多,总结来说就是在相同的作用域内出现多个同名的类、函数或变量。
定义命名空间
【例1】
Hello.h
#pragma oncenamespace SH{class Hello{public:Hello(void);~Hello(void);public:void SayHello();};void HelloWord();}
Hello.cpp
#include "StdAfx.h"#include "Hello.h"#include <iostream>using std::cout;using std::endl;namespace SH{Hello::Hello(void){}Hello::~Hello(void){}void Hello::SayHello(){cout << "how are you!" << endl;}void HelloWord(){cout << "Hello World!" << endl;}}
Hello.cpp还可以定义成这样:
SH::Hello::Hello(void){}SH::Hello::~Hello(void){}void SH::Hello::SayHello(){cout << "how are you!" << endl;}void SH::HelloWord(){cout << "Hello World!" << endl;}
【例2】命名空间的定义也可以是不连续的,,如:
Hello.h
#pragma oncenamespace SH{class Hello{public:Hello(void);~Hello(void);public:void SayHello();};}void HelloWord();namespace SH{void Hello2Sunly();}
Hello.cpp
#include "StdAfx.h"#include "Hello.h"#include <iostream>using std::cout;using std::endl;SH::Hello::Hello(void){}SH::Hello::~Hello(void){}void SH::Hello::SayHello(){cout << "how are you!" << endl;}void HelloWord(){cout << "Hello World!" << endl;}void SH::Hello2Sunly(){cout << "Hello Sunly!" << endl;}
使用命名空间加命名空间的前缀和作用域运算附
#include "stdafx.h"#include <iostream>int main(){std::cout << "Hello World!" << std::endl;return 0;}
这种方式最安全,因为使用的每个变量都用命名空间的前缀指明了具体的版本。但比较麻烦,因为每次使用都要加前缀。
using声明
#include "stdafx.h"#include <iostream>using std::cout;using std::endl;int main(){cout << "Hello World!" << endl;return 0;}
using指示
#include "stdafx.h"#include <iostream>#include "Hello.h"using namespace std;using namespace SH;int main(){cout << "Hello World!" << endl;Hello2Sunly();return 0;}
这种方式将某一命名空间下的所有变量都注入进来了,这种方式使编程更简单了,不用把需要用到的变量一个一个地用using加进来,但又再次带来了命名冲突的危险,因为多个命名空间都提到当前的作用域下,又有可能发生重名的问题。
尝到你和你在一起的快乐,你是唯一能让我尝到酸甜苦辣的人。