正在使用命名空间范围

Using namespace scope

本文关键字:命名空间 范围      更新时间:2023-10-16

我尝试了以下代码。当我编译时,我得到了一个错误,即first_var存在不明确的实例,而我引入了在最后一个cout 之前使用命名空间second_space

我想这是因为最后一个cout同时使用了这两个名称空间。命名空间没有重写概念?是否有命名空间作用域可以结束,或者从使用命名空间点继续到文件结束?

#include<iostream.h>
namespace first_space{
    int first_var;
}
namespace second_space{
    int first_var = 1;
}
int main()
{
    cout<<"Hello World"<<endl;
    cout<<"First Namespace Variable using namespace identifier:"<<first_space::first_var<<endl;
    using namespace first_space;
    cout<<"First Namespace Variable using using identifier:"<<first_var<<endl;
    using namespace second_space;
    cout<<"Second Namespace Variable using using identifier:"<<first_var<<endl;
}

编辑1:

我试过下面这样的东西。在main中声明了一个名称相同的变量,为其分配了一个值1,然后使用下面的命名空间使用。但我看到了,在最后两个cout中,first_var的值被打印为1。这里没有歧义。所以名称空间没有任何效果?为什么会这样?

#include<iostream.h>
namespace first_space{
    int first_var;
}
namespace second_space{
    int first_var = 1;
}
int main()
{
    int first_var =1 ;
    using namespace first_space;
    cout<<"Hello World"<<endl;
    cout<<"First Namespace Variable using namespace identifier:"<<first_space::first_var<<endl;
    cout<<"First Namespace Variable using using identifier:"<<first_var<<endl;
 //   using namespace second_space;
    cout<<"Second Namespace Variable using using identifier:"<<first_var<<endl;
}

输出:

Hello World
First Namespace Variable using namespace identifier:0
First Namespace Variable using using identifier:1
Second Namespace Variable using using identifier:1

是的,您是正确的,在第二个using语句之后,变量first_var现在是不明确的,因为这两个名称空间都是有效的,并且在名称查找方面具有相同的优先级。

两种解决方法是

a) 添加大括号以强制执行匿名范围(实时演示)

{
using namespace first_space;
cout << "First Namespace Variable using using identifier:" << first_var << endl;
}
{
using namespace second_space;
cout << "Second Namespace Variable using using identifier:" << first_var << endl;
}

b) 删除using关键字并直接使用名称空间范围

cout << "First Namespace Variable using using identifier:" << first_space::first_var << endl;
cout << "Second Namespace Variable using using identifier:" << second_space::first_var << endl;

就我个人而言,我会选择选项b。首先添加名称空间的主要原因之一是为了避免歧义问题,因此用一堆using语句污染当前范围会破坏这一点。