请教一个名空间的问题

srxumin 2016-04-25 10:06:54
namespace na
{
int i = 5;
}

namespace nb
{
int i = 10;
}

using namespace na;

void main()
{
using namespace nb;
i = 20; //这行报错
}

我知道将using namespace nb;改成用using nb::i;就不会报错
但我想问的是:如果不用using nb::i;这种声明的方式,就只用using namespace指示符,有没有什么方法处理这个变量冲突问题?
...全文
180 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
renwotao2009 2016-04-29
  • 打赏
  • 举报
回复
引用 16楼我是你的主体 的回复:
引用 15 楼 renwotao2009 的回复:
[quote=引用 9 楼 srxumin 的回复:] 还有高手帮忙吗?二楼说到点子上了,可能是静态存储区的问题。难道冲突是由于静态存储区引起的?
不是由于存储引起的,二是因为编译时变量名查找引起的,当你的给i赋值时,前面两个命名空间中都定义了i变量,这两个i变量都是强引用,所以自然就冲突了
也就是说:在编译期间,编译器会自动同时扫瞄na和nb里的所有变量,不管它们是在什么位置using namespace的对吧?[/quote]说错了,准确说编译期间把各个命名空间的变量的变量名存储到符号表,并在静态区给他们分配好空间,但遇到main 函数内的i 无法确定给他哪个命名空间中i的地址。
renwotao2009 2016-04-29
  • 打赏
  • 举报
回复
引用 16楼我是你的主体 的回复:
引用 15 楼 renwotao2009 的回复:
[quote=引用 9 楼 srxumin 的回复:] 还有高手帮忙吗?二楼说到点子上了,可能是静态存储区的问题。难道冲突是由于静态存储区引起的?
不是由于存储引起的,二是因为编译时变量名查找引起的,当你的给i赋值时,前面两个命名空间中都定义了i变量,这两个i变量都是强引用,所以自然就冲突了
也就是说:在编译期间,编译器会自动同时扫瞄na和nb里的所有变量,不管它们是在什么位置using namespace的对吧?[/quote]是的
srxumin 2016-04-29
  • 打赏
  • 举报
回复
引用 15 楼 renwotao2009 的回复:
引用 9 楼 srxumin 的回复:
还有高手帮忙吗?二楼说到点子上了,可能是静态存储区的问题。难道冲突是由于静态存储区引起的?
不是由于存储引起的,二是因为编译时变量名查找引起的,当你的给i赋值时,前面两个命名空间中都定义了i变量,这两个i变量都是强引用,所以自然就冲突了
也就是说:在编译期间,编译器会自动同时扫瞄na和nb里的所有变量,不管它们是在什么位置using namespace的对吧?
赵4老师 2016-04-27
  • 打赏
  • 举报
回复
研读g++源代码namespace处理相关片断?
srxumin 2016-04-27
  • 打赏
  • 举报
回复
引用 9 楼 srxumin 的回复:
还有高手帮忙吗?二楼说到点子上了,可能是静态存储区的问题。难道冲突是由于静态存储区引起的?
版主,我知道尽量不要用using namespace的规则的,我现在就是想了解下为什么我一开始发问的代码是什么原因造成冲突的,这个您知道吗?
paschen 版主 2016-04-27
  • 打赏
  • 举报
回复
通常不要用using namespace,否则就失去了名称空间的意义
srxumin 2016-04-27
  • 打赏
  • 举报
回复
还有高手帮忙吗?二楼说到点子上了,可能是静态存储区的问题。难道冲突是由于静态存储区引起的?
renwotao2009 2016-04-27
  • 打赏
  • 举报
回复
引用 9 楼 srxumin 的回复:
还有高手帮忙吗?二楼说到点子上了,可能是静态存储区的问题。难道冲突是由于静态存储区引起的?
不是由于存储引起的,二是因为编译时变量名查找引起的,当你的给i赋值时,前面两个命名空间中都定义了i变量,这两个i变量都是强引用,所以自然就冲突了
赵4老师 2016-04-27
  • 打赏
  • 举报
回复
引用 13 楼 srxumin 的回复:
[quote=引用 12 楼 zhao4zhong1 的回复:] 研读g++源代码namespace处理相关片断?
谢谢赵老师,我已经下载了G++源码 因为代码太多,一下子没找到,请问namespace的片段是在哪个文件名当中?[/quote] 会用grep命令吗?
EXAMPLES
1.
To find all uses of the word "Posix" (in any case) in file text.mm and write with line numbers: 


grep -i -n posix text.mm



2.
To find all empty lines in the standard input: 


grep ^$


or: 



grep -v .



3.
Both of the following commands print all lines containing strings "abc" or "def" or both: 


grep -E 'abc|def'


grep -F 'abc
def'



4.
Both of the following commands print all lines matching exactly "abc" or "def" : 


grep -E '^abc$|^def$'


grep -F -x 'abc
def'


srxumin 2016-04-27
  • 打赏
  • 举报
回复
引用 12 楼 zhao4zhong1 的回复:
研读g++源代码namespace处理相关片断?
谢谢赵老师,我已经下载了G++源码 因为代码太多,一下子没找到,请问namespace的片段是在哪个文件名当中?
小灸舞 2016-04-26
  • 打赏
  • 举报
回复
using namespace导入整个命名空间中的所有成员的名称,包括那些可能根本用不到的名称
srxumin 2016-04-26
  • 打赏
  • 举报
回复
这个说的有些离题了。我再简化一下问题吧,请参照我一开始的提问代码。现在我们不说using,只说using namespace,这样使用为什么会冲突?编译器底层都做了些什么造成冲突? 名空间的使用方法和禁忌,百度都可以搜到,各位大侠就不用解释的那么清楚了,谢谢
小灸舞 2016-04-26
  • 打赏
  • 举报
回复
一般来说好的编程风格是不会使用using namespace 这样的格式的. 尤其是在拥有多个命名空间的时候. namespace 本来就是为了解决命名冲突而设立的~ 好的用法是只using具体的函数名或者类名, 必要时写上全名以强调.搜索 using std::vector; using std::cout; using std::cin; // 仅单独using特定的名称简写.
srxumin 2016-04-26
  • 打赏
  • 举报
回复
我想了解一下,哪些情况下会冲突,既然名空间成员都在静态区,为什么用using不会冲突,而使用using namespace就会冲突?能从原理层说明这个问题吗?
小灸舞 2016-04-26
  • 打赏
  • 举报
回复
using namespace *;(这里的*表示可以是任何命名空间)的作用是释放命名空间*中的变量或函数等,使之在被访问时可以不必加“命名空间::”,访问方法与一般的变量或函数无异 using namespace *;会给我们书写程序带来方便,但也要慎用,如果释放了多个命名空间中的东西后,它们又可能会引起命名冲突。
srxumin 2016-04-26
  • 打赏
  • 举报
回复
那我可不可以这么理解: 既然是在静态存储区,在真实的项目开发中,如果两个名空间a和b中有相同的命名,在同一个cpp文件中同时用了using namespace a;和using namespace b;,无论在哪个域中使用,都会冲突是不是? 其实用using的时候还好理解的,可参照普通变量的声明来理解。但是用using namespace的时候,总感觉它不能参照以前学过的任何变量定义的变量生命期来理解。
renwotao2009 2016-04-25
  • 打赏
  • 举报
回复
只能用using nb::i来赋值,因为有多个命名空间且变量名相同。c++就是用命名空间来解决变量可能出现同名的问题。命名空间内的变量经过c++名字处理后存储在静态区,处理后的变量名肯定与空间名相关。
旧剑鞘 2016-04-25
  • 打赏
  • 举报
回复
nb::i = 20; 尽量用using nb::i; 而不是using namespace nb;

64,678

社区成员

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

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