C++命名空间(namespace)提出的原因及解决的问题


返回 我的技术栈(Technology Stack)



在c++中,名称(name)可以是符号常量、变量、函数、结构、枚举、类和对象等等。

工程越大,名称互相冲突性的可能性越大。

另外使用多个厂商的类库时,也可能导致名称冲突。

为了避免,在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标识符的命名发生冲突,

标准C++引入关键字namespace(命名空间/名字空间/名称空间),可以更好地 控制标识符的作用域 。

namespace A{
	int a = 10;
}
namespace B{
	int a = 20;
}
void test(){
	cout << "A::a : " << A::a << endl;
	cout << "B::a : " << B::a << endl;
}
cout是c++中的标准输出流,endl是输出换行并刷新缓冲区】

命名空间只能全局范围内定义#

应该写在全局范围
void test(){
	局部变量
    
	namespace A{   错误写法!!!!
		int a = 10;
	}
	namespace B{   错误写法!!!!
		int a = 20;
	}
	cout << "A::a : " << A::a << endl;
	cout << "B::a : " << B::a << endl;
}

命名空间可嵌套命名空间#

namespace A{
	int a = 10;
	namespace B{
		int a = 20;
	}
}
void test(){
	cout << "A::a : " << A::a << endl;
	cout << "A::B::a : " << A::B::a << endl;
}

命名空间可以随时把新的成员加入已有的命名空间中#

命名空间是开放的,即可以随时把新的成员加入已有的命名空间中【命名空间下可以放函数、变量、结构体、类】

namespace A{
	int a = 10;   # 变量
    struct Person   # 结构体
    {
    };
    class Animal{}; # 类
}

namespace A{  // 【这里的A命名空间会合上面的命名空间A进行合并】
	void func(){  # 函数
		cout << "hello namespace!" << endl;
	}
}

void test(){
	cout << "A::a : " << A::a << endl;
	A::func();
}

声明和实现可分离#

namespace MySpace{
	void func1();
	void func2(int param);
}
void MySpace::func1(){
	cout << "MySpace::func1" << endl;
}
void MySpace::func2(int param){
	cout << "MySpace::func2 : " << param << endl;
}

无名(匿名)命名空间,相当于给这个标识符加上了static【只能在本文件内访问】#

无名(匿名)命名空间,意味着命名空间中的标识符【只能在本文件内访问】,相当于给这个标识符加上了static,使得其可以作为内部连接

namespace{
	int a = 10;
	void func(){ cout << "hello namespace" << endl; }
}
【相当于写了 static int a ; static void func(){}   这些都只能在当前文件内使用】

void test(){
	cout << "a : " << a << endl;
	func();
}

命名空间别名#

namespace veryLongName{
	
	int a = 10;
	void func(){ cout << "hello namespace" << endl; }
}

void test(){
	namespace shortName = veryLongName;
	cout << "veryLongName::a : " << shortName::a << endl;
	veryLongName::func();
	shortName::func();
}

实际案例#

image

posted @   言非  阅读(233)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示
主题色彩