请教大型程序中命名空间用法的一些问题

hanyj_3000 2011-09-17 11:31:14
我对命名空间的用法不太熟,尤其是不知道别人大型程序里头,命名空间是怎么用的。
假如一个大型程序中有下面这么样的一个命名空间

namespace MyNSP1
{
class A
{
public:
void fun1(int a,int b);
private:
int x,y;
};

...//尚有大量其他类,或函数、变量等。
}

假如这个大型程序还有不少其他比较庞大的命名空间MyNSP2、MyNSP3、MyNSP4 .....

1、大型程序一般是不是把这个MyNSP1命名空间声明到一个头文件中去的?比如放到MyNSP1.h中去。

2、命名空间是用一个大花括号扩住的,如果这个MyNSP命名空间内容可能非常庞大繁多,一些成员函数的实现再放到命名空间去实现,那岂不是使得这个大花括号非常肿大?

3、所以诸如class A中的成员函数fun1应该是放到另外的文件.cpp文件中去实现,如此一来格式要怎么写呢?
void MyNMP::A::fun1(int a,int b){ ... }//格式是这样写吗,看起来就感觉别扭,应该不对。

4、如果这个大型程序最终是做成一个库提供给别的公司用,那如何把MyNSP1、MyNSP2、MyNSP3、MyNSP4 .....这么多的命名空间声明成接口给别人用?

不好意思,以上问题多了点,在此先谢过各大侠!
...全文
100 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hanyj_3000 2011-09-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hui12345685 的回复:]

1:头文件和源文件都要有
如:namespace aaaa{}//namespace aaaa
2:命名空间在源文件的实现可能比较多,但是只要在末尾的大括号处写上注释,也很清晰。如果是一个文件代码非常庞大的话,那很有可能是设计问题,设计的时候没有考虑周全。
3:一般来说a.h,实现都是放到a.cpp中去做
4:如果库不是很大的话,没有必要弄那么多命名空间,可以都放到一个命名空间里面
[/Quote]
好,在你和“mstlq”的解析下,我的疑问基本解决。不过还有一个问题,你说“如果库不是很大的话,没有必要弄那么多命名空间,可以都放到一个命名空间里面”,那要是声明非常多,假如达到了几千行,难道也只搞一个命名空间吗,那样这个.h文件太大了吧
hui12345685 2011-09-17
  • 打赏
  • 举报
回复
1:头文件和源文件都要有
如:namespace aaaa{}//namespace aaaa
2:命名空间在源文件的实现可能比较多,但是只要在末尾的大括号处写上注释,也很清晰。如果是一个文件代码非常庞大的话,那很有可能是设计问题,设计的时候没有考虑周全。
3:一般来说a.h,实现都是放到a.cpp中去做
4:如果库不是很大的话,没有必要弄那么多命名空间,可以都放到一个命名空间里面
mstlq 2011-09-17
  • 打赏
  • 举报
回复
是的
回复内容太短了!
hanyj_3000 2011-09-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mstlq 的回复:]

关于1 2 3
h里面用一个相当大的花括号
cpp里面照样用一个相当大的花括号(不会像问题三写得那么别扭的)
顺便一说,如果楼主确实觉得花括号有碍你的审美观 可以用宏
#define BEGIN_NAMESPACE_HH namesapce hh {
#define END_NAMESPACE_HH }

BEGIN_NAMESPACE和END_NAMESPACE_HH一前一后放……
[/Quote]
你说的“cpp里面照样用一个相当大的花括号”,那这个花括号前面是不是也要加上namespace MyNSP1啊
mstlq 2011-09-17
  • 打赏
  • 举报
回复
关于1 2 3
h里面用一个相当大的花括号
cpp里面照样用一个相当大的花括号(不会像问题三写得那么别扭的)
顺便一说,如果楼主确实觉得花括号有碍你的审美观 可以用宏
#define BEGIN_NAMESPACE_HH namesapce hh {
#define END_NAMESPACE_HH }

BEGIN_NAMESPACE和END_NAMESPACE_HH一前一后放在h文件里,也放在cpp文件里就可以

关于4
把h文件给别的公司,他们自然知道怎么搞(命名空间的信息,头文件里已经有了)
gold_water 2011-09-17
  • 打赏
  • 举报
回复
一言以蔽之:命名空间其实就是规划作用域的玩意.
飞天御剑流 2011-09-17
  • 打赏
  • 举报
回复
1、大型程序一般是不是把这个MyNSP1命名空间声明到一个头文件中去的?比如放到MyNSP1.h中去。
------------------------------------------------------------------------------
一般而言,是这样的。


2、命名空间是用一个大花括号扩住的,如果这个MyNSP命名空间内容可能非常庞大繁多,一些成员函数的实现再放到命名空间去实现,那岂不是使得这个大花括号非常肿大?
3、所以诸如class A中的成员函数fun1应该是放到另外的文件.cpp文件中去实现,如此一来格式要怎么写呢?
void MyNMP::A::fun1(int a,int b){ ... }//格式是这样写吗,看起来就感觉别扭,应该不对。
----------------------------------------------------------------------------------
是这样写的。如果你觉得太长别扭,可以将fun1的定义也放到MyNMP中去,但不用放到头文件中,可以在fun1所在的编译单元中也定义一个名称空间MyNMP,这样就可以直接使用A::fun1了,名称空间是可以累积的,不同编译单元之间具有相同名字的名称空间都属于同一个名称空间。

还有另一个方法是定义名称空间别名,例如:namespace NMP = MyNMP;




4、如果这个大型程序最终是做成一个库提供给别的公司用,那如何把MyNSP1、MyNSP2、MyNSP3、MyNSP4 .....这么多的命名空间声明成接口给别人用?
-----------------------------------------------------------------------------
需要文档说明,就象标准库使用的std那样,需要在接口规范中用文字说明。
stendson 2011-09-17
  • 打赏
  • 举报
回复
命名空间是解决不同模块的名字冲突问题,将命名空间里的内容模块化,以解决头文件冗余,降低编译依赖性,因为全部都写进头文件中那么编译包含头文件的文件都要编译该.h文件 所以可以将其不同的内容写到不同的模块中

vector.h
namespace std
{
class vector
{
}
}
list.h
namespace std
{
class list
{
}
}
basic_string.h
namespace std
{
class basic_string
{
}
}

64,654

社区成员

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

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