using namespace问题

srxumin 2019-09-21 11:35:03
#include <iostream>
using namespace std;

namespace N1 {
namespace NA {
int i = 10;
}
}

namespace N2 {
int i = 20;
void fun() {
using namespace N1::NA;
cout << "i=" << i << endl;
//问题一:输出20,为什么不是输出10?
//问题二:既然输出20,为什么不会跟int i=30这行冲突?
}
}

int i = 30;
int main() {
using namespace N2;
fun();
cout << "i=" << i << endl; //问题三:编译通不过,注释后可以通过。为什么i变量会冲突?
return 0;
}

注:复制粘贴的就不给分了
...全文
198 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
uouo88 2019-10-13
  • 打赏
  • 举报
回复
引用 7 楼 srxumin 的回复:
虽然问题没解决,先谢谢各位大神的热心帮助
关于:using namespace,它具有将命名空间成员提升到包含(命名空间本身和 Using 指示)的最近作用域的能力。这句话有篇专门的分析代码,我截下来给大家看看:
namespace C1
{
int i = 1;
namespace C2
{
int i = 2;
}
namespace C3
{
namespace C4
{
void f()
{
using namespace C2; // 将 C2::i 提升到 C1 空间中
//下面这句话直觉上是屏蔽了int i=1这个变量,实际上编译器将会提示:i 不明确,和i=1这行发生冲突
cout << i << endl;
}
}
}
}


但我现在遇到的问题比这更复杂一些,名字空间发生了嵌套,感觉跟堆栈应该有点关系,百度不到名空间嵌套方面的文章,所以来求助大家了

#include <iostream>
using namespace std;

namespace N1 {
namespace NA {
int i = 10;
}
}

namespace N2 {
int i = 20;
void fun() {
using namespace N1::NA;
cout << "i=" << i << endl;
//问题一:输出20,为什么不是输出10?
//问题二:既然输出20,为什么不会跟int i=30这行冲突?
}
}

int i = 30;
int main() {
using namespace N2;
fun();
cout << "i=" << i << endl; //问题三:编译通不过,注释后可以通过。为什么i变量会冲突?
return 0;
}



这个跟嵌套不嵌套有什么关系,你两个命名空间C1和C2中都有定义i,使用的时候又没有明确用哪个命名空间的,当然会出错。
srxumin 2019-10-13
  • 打赏
  • 举报
回复
虽然问题没解决,先谢谢各位大神的热心帮助 关于:using namespace,它具有将命名空间成员提升到包含(命名空间本身和 Using 指示)的最近作用域的能力。这句话有篇专门的分析代码,我截下来给大家看看:
namespace C1
{
	int i = 1;
	namespace C2
	{
		int   i = 2;
	}
	namespace C3
	{
		namespace C4
		{
			void f()
			{
				using namespace C2; // 将 C2::i 提升到 C1 空间中  
				//下面这句话直觉上是屏蔽了int i=1这个变量,实际上编译器将会提示:i 不明确,和i=1这行发生冲突
				cout << i << endl;  
			}
		}
	}
}
但我现在遇到的问题比这更复杂一些,名字空间发生了嵌套,感觉跟堆栈应该有点关系,百度不到名空间嵌套方面的文章,所以来求助大家了
#include <iostream>
using namespace std;
 
namespace N1 {
    namespace NA {
        int i = 10;
    }
}
 
namespace N2 {
    int i = 20;
    void fun() {
        using namespace N1::NA;
        cout << "i=" << i << endl;
        //问题一:输出20,为什么不是输出10?
        //问题二:既然输出20,为什么不会跟int i=30这行冲突?
    }
}
 
int i = 30;
int main() {
    using namespace N2;
    fun();
    cout << "i=" << i << endl;            //问题三:编译通不过,注释后可以通过。为什么i变量会冲突?
    return 0;
}
uouo88 2019-10-01
  • 打赏
  • 举报
回复
你看到的那本书上的那句话,虽然我没看过,但是我感觉可以这么理解:
using指示具有将命名空间成员提升到包含命名空间本身和usin指示的最近作用域的效果


举个例子吧:
namespace myspace
{
int x = 0;
string y = "test";
}

int main() {
using namespace myspace;
//这里可以直接使用x和y
return 0;
}


根据上面的例子,理解分为2点:
1. 不管你是否使用了using指示,x和y的命名空间首先在原来的命名空间myspace中。
2.由于main函数中使用了using namespace myspace;这句后,x和y又被提升到了最近作用域中。即上面例子中蓝色标出来的区域。
uouo88 2019-10-01
  • 打赏
  • 举报
回复
引用 4 楼 srxumin 的回复:
using指示和using声明的区别我是知道的,using声明是比较好理解的,我主要想问问using指示的问题
对于using指示,《C++ primer》有这样一句话:
using指示具有将命名空间成员提升到包含命名空间本身和usin指示的最近作用域的效果

好像两位大神忽略了这句话的作用,我的疑问主要也是集中在这句话上


using指示的名字作用域,从using指示点开始,直到包含该using指示的作用域的结尾处。不知道这样说是否好理解一点。
srxumin 2019-09-23
  • 打赏
  • 举报
回复
using指示和using声明的区别我是知道的,using声明是比较好理解的,我主要想问问using指示的问题 对于using指示,《C++ primer》有这样一句话:
using指示具有将命名空间成员提升到包含命名空间本身和usin指示的最近作用域的效果
好像两位大神忽略了这句话的作用,我的疑问主要也是集中在这句话上
棉猴 2019-09-21
  • 打赏
  • 举报
回复


问题一:输出20,为什么不是输出10?
在以下代码中
cout << "i=" << i << endl;

由于二义性,此时将i默认为是命名空间N2中的i,如果需要使用N1::NA中的i,需要N1::NA::i
此时需要注意的时,如果在命名空间N1::NA中定义一个变量j,而由于命名空间N2中没有变量j,不存在二义性,所以可以直接使用j,而不是N1::NA::j,但是由于命名空间N2中有i,所以必须使用N1::NA::i
问题二:既然输出20,为什么不会跟int i=30这行冲突?
int i=30

是在全局的命名空间中定义的,
int i = 20;

是在命名空间N2中定义的,所以在命名空间N2中,使用i时,i的值是20,在命名空间N2之外,则i的值是30,不会冲突。
问题三:编译通不过,注释后可以通过。为什么i变量会冲突?
依然是二义性的问题,此时全局命名空间和N2中都有i,所以会报错,而且错误提示信息为“i不明确”
此时,如果需要使用全局命名空间中的i的值,即30,则可以用以下代码
cout << "i=" << ::i << endl;

如果想用N2中的i的值,即20,则可以用以下代码
cout << "i=" << N2::i << endl; 
uouo88 2019-09-21
  • 打赏
  • 举报
回复
补充一下,using namespace N2;叫做using指示,而using N2::i;这种的叫做using声明,你如果写成后面这种形式,那么即使没有 cout << "i=" << i << endl; 这句,编译器也会直接出错,如果采用using指示的形式,那么直到你显示写出 cout << "i=" << i << endl; 这句后,编译器才会报错,不信你可以试试~
uouo88 2019-09-21
  • 打赏
  • 举报
回复
因为 int i = 30; 和 using namespace N2;冲突了啊,N2的命名空间中也有一个i的定义,你如果要使用N2中的i,需要显示的加上作用域,像下面这样:
cout << "i=" << N2::i << endl;

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧