在这一章中C++ 头文件说明_c++ 头文件 说明注释写法-CSDN博客
提到了可以用命名空间的方式规避函数变量命名冲突。
具体是怎么做呢?今天在这里说明一下。
用namesapce 来定义命名空间。
如:
cpp
namespace myspace{
}
在大括号里,就可以写你的变量和函数代码了。
这样,这里面变量和函数都属于mysapce命名空间。
示例代码:
cpp
#include <iostream>
using namespace std;
namespace myspace{ //定义命名空间myspace
int a = 5;
void couta()
{
cout << a << endl;
}
}
namespace mysp2 //定义命名空间mysp2
{
int a = 52;
void couta()
{
cout << a << endl;
}
}
int main() {
//调用命名空间各自的couta函数
myspace::couta();
mysp2::couta();
}
效果:

可以看到,定义命名空间后,就可以放心的在里面写代码了,不用担心和其他文件命名冲突了。
只需要在调用的时候,命名空间名加上::使用。
如果我们不想加上命名空间名,则开头加上using namespace myspace 引用。
cpp
#include <iostream>
using namespace std;
namespace myspace{ //定义命名空间myspace
int a = 5;
void couta()
{
cout << a << endl;
}
}
namespace mysp2 //定义命名空间mysp2
{
int a = 52;
void couta()
{
cout << a << endl;
}
}
using namespace myspace;//引入myspace命名空间
int main() {
//直接调用
couta();
}
这里需要注意的是如果后面又加了using namespace mysp2;
两个命名空间有同名变量或函数,这种用法就会有冲突是不合法的。
如果不想using引用整个命名空间,只想使用命名空间的某个函数或某个变量,可以这样引用:
cpp
using myspace::couta;
这样mysapce命名空间的变量a不会被访问到。
前面是单文件的示例了,接下说一下多文件怎么使用。
像正常编写多文件cpp一样,需要分成头文件.h和cpp(注意:另提一点如果是定义模板类则尽量代码也写在.h中)。
头文件中,写命名空间的声明,变量要加上extern ,函数名可以不用加,如
myspace.h
cpp
//命名空间 声明
namespace myspace {
extern int a;
void couta();
}
myspace.cpp
cpp
#include<iostream>
#include"myspace.h"
using namespace std;
//命名空间定义
namespace myspace{
int a = 10;
void couta()
{
cout << a << endl;
}
}
main主程序cpp
cpp
#include <iostream>
#include"myspace.h"
using namespace std;
//命名空间 使用
using namespace myspace;
int main() {
couta();
}
运行效果:

ok,以上就是命名空间大概的使用和创建的方法。
这里还要提的一个点的是:
cpp
using namespace myspace;
int main() {
myspace::couta();
}
using了命名空间,然后又再指定命名空间mysapce::couta.
为什么好像不会引起重复引用的问题,比如不会变成这样:
myspace::myspace::couta();
为了避免这样的误解,我们必须了解命名空间的解析方法。
当使用了using namespace myspace;后,编译器会在当前的作用域查找变量和函数是否属于mysapce。而不是给所有的函数和变量硬性加上mysapce。这是智能的。
而当遇到myspace::couta();,这种用法的优先级更高,所以也会忽略掉using namespace myspace;而是直接去mysapce里面查找。所以这两者共同使用完全没问题。