在c++中遇到的很多坑都是命名空间的问题,大部分就是命名空间导致的函数/方法冲突,遇到这样的bug往往很耗费时间,命名空间简单地可以分为自定义和系统命名空间,我们来看我们常见的一个代码,如图所示
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
cout<<"hello,world"<<endl;
}
这里我们用了标准库的命令空间std,将std命名空间的所有成员引入当前作用域,因此我们可以直接使用std作用域下面的cout和endl函数,否则我们必须显示地使用前缀std::cout来访问标准库的成员,代码如下所示
#include<stdio.h>
#include<iostream>
int main()
{
std::cout<<"hello,world"<<std::endl;
}
接下来我们看自定义命名空间,在demo1.h文件中代码如下所示
namespace Test
{
int add(int a,int b)
{
return a+b+1;
}
}
在demo1.cpp中代码如下所示
#include "demo1.h"
#include<iostream>
using namespace std;
int add(int a,int b)
{
return a+b;
}
int main()
{
cout<<Test::add(10,20)<<endl;
return 0;
}
我们现在有2个add函数,我demo1.cpp中输出命名空间Test的add函数,结果如下所示可见正执行的是Tests作用域下的add函数,如果我直接使用using namspace Test呢,demo1.cpp代码改成如下所示
#include "demo1.h"
#include<iostream>
using namespace std;
int add(int a,int b)
{
return a+b;
}
int main()
{
using namespace Test;
cout<<add(10,20)<<endl;
return 0;
}
结果如图所示可见报错了,由于用了using namspace Test,导致全局有2个add函数,编译器无法识别用哪个add函数,导致函数冲突了,因此最好减少using namspace xxx的使用,容易导致bug,为了方便导致了bug,这是很容易忽略的!
点击此处登录后即可评论