关于“名字空间”的两个问题

xenter 2003-09-14 12:09:47
一、在C++编程中,为什么要用“名字空间”?它的好处在那?
二、“名字空间”的成员是不是都是全局的?或者是在该域中是全局的?
...全文
32 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
cgsw12345 2003-09-14
  • 打赏
  • 举报
回复
无名字的“名字空间”可以当作全局来用!
namespace
{
void foo(/**/) //可以当作全局函数来用。
}
cgsw12345 2003-09-14
  • 打赏
  • 举报
回复
避免名字冲突,说简单点就是,防止你的函数名与所用的类库函数名相同(当名说法不太准确).
积木 2003-09-14
  • 打赏
  • 举报
回复
在开发不同的库时,不同的开发者很可能出现命名重复的现象(过长的名字虽然会避免这个问题,但是却给开发和利用这个库带来麻烦)
但是如果各自的库都使用不同的名字空间名(名字空间的名字很容易避免重复的),就会避免这些问题了
晨星 2003-09-14
  • 打赏
  • 举报
回复
俺也说不清楚,推荐你看《The C++ Programming Language》吧。
帮你up。
xenter 2003-09-14
  • 打赏
  • 举报
回复
不胜感谢
积木 2003-09-14
  • 打赏
  • 举报
回复
是的,诚然 class 的一个功能也是名字空间
而且这个在库开发上也有应用体现,例如STL中对float,int等内部数据类型的界定的实现
声明时可以用
class C
{
static int i;
}
但是他们的调用机制是有区别的
你说是调用一个类的方法开销少呢?还是调用一个全局的单独的函数开销少
如果我想调用一个类中的函数(假设不是静态的函数),我就得进行实例化,才能调用
那么实例化的开销谁来负责呢?如果不想实例化,好的,全声明成静态函数
^_^,这个开销也是非常的惊人啊,编译器也需要为这个类的所有的静态成员预先分配空间

但是namespace就不同了,它不需要实例化,也不需要将那些函数全声明为静态的成员
仅仅是
using namespace std;
就可以完成对std中封装的各种方法的调用,而不用再让系统有那么大的开销啊。

还有你的那个定义n个hello,这个太极端了吧,有人会这么干吗?
有n个hello的库吗?所以这个机制还是很不错的啊
xenter 2003-09-14
  • 打赏
  • 举报
回复
我明白了,名字空间避免了对象,函数,类型,模版等命名冲突,但是能保证它本身的“名字空间”的命名冲突吗?如果大家定义了N个同样的namespace hello;我看同样有冲突。你说呢?
zbstone 2003-09-14
  • 打赏
  • 举报
回复
===========摘自c++ primer P349=============
8.5 名字空间的定义
缺省情况下,在全局域(也被称作全局名字空间域,global namespace scope)中声明的每个对象,函数,类型,模版都引入了一个全局实体(global entity)。在全局名字空间域引入的全局实体必须有惟一的名字。例如函数和对象不能有相同的名字,无论它们是否在同一程序文本文件中被声明。
……
名字空间允许我们更好的处理全局名字空间污染的问题。库的作者可以定义一个名字空间,把库中的名字隐藏在全局名字空间之外!

==========个人观点===============
名字空间的使用可能是在比较大的程序设计过程中,为了避免重名以及长命名的出现而设计的吧!
xenter 2003-09-14
  • 打赏
  • 举报
回复
To: goodboy1881(三井)

一、如果只是以“避免变量命名的冲突”为目的,只要放在某个类中就可以避免和别的类的变量命名冲突了,再来搞一“名字空间”的做法,不是重复了么?

二、在类中所有的成员在该类的作用域中也是全局的。

所以,我就看不出搞“名字空间”目的何在?


69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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