English 中文(简体)
是否有正确办法处理C++中的名称空间
原标题:Is there a right way to approach namespaces in C++
  • 时间:2010-11-02 09:26:19
  •  标签:
  • c++

I m infected by Java, C# and AS3, I keep wanting to use C++ namespaces in the same way but I keep reading that they re not really designed with this in mind.

是否有使用名称空间的正确方法? 例如,在由十几个图书馆项目(如图象、声音、数学等)和几个应用项目组成的编码数据库中,需要做些什么? 是否正确/优待/优待:

  • To put everything a top-level MyCompanyName or MyProjectName namespace?
  • To have a (sub-)namespace for each library

Are there official rules/guidelines as part of C++, or only recommendations which people tend to follow?

问题回答

正如我在关于@Nim的答复的评论中提到的,关键在于建立一个结构:practical。

如果是的话,请看一下。 NET框架,其名称空间有很长的地名,并且被深深地nes(Say,System.Collections.Generic.List<T>)。 这一点同样适用于 Java。 你的名字非常长,充斥着大面积的空域,毫无效果。

我第一次创立了<代码>List级,Im将陷入名称碰撞,而这正是名称空间应当预防的。 (由于这似乎给一位评论员提出了错误的想法,当然我能够创建自己的名单类别。) 但每当我use时,我就有陷入冲突的风险。 “标准”<代码>List或其名称空间都非常常用,因此,我有很好的机会使用<>使用的这个名称空间,这意味着,如果我也想提及我的<>/><<>>>>。 在同一个档案中,我有冲突。

By contrast, the C++ standard library puts nearly everything in a simple std namespace (and a few things in std::ios)

从实际来看,网络名称空间实际上是一种浪费。 它们没有效果。 每份法典文件都有一份长长的<代码>使用X;使用Y;使用Z,因此,净效应是,在你写你的法典时,没有一个名称空间实际上有效。 为了编制目录,我只读到List<int>。 名称空间基本上已经消失。

在C++中,人们被劝阻使用<密码>,使用带<><>>的空间,因此,为了使用标准图书馆符号,我们使用<代码>std prefix:std:vector<int>

烟雾使用类似东西:几乎所有东西都载于<条码>boost。 然后将几个复杂的图书馆放在次名称空间,例如<代码>boost:filesystem或boost:mpl,一些图书馆“内部使用”名称空间,通常名称为aux<>/code>,但意图是供用户看不见(或至少被忽视)。

这更能保护名称空间的优势:避免命名冲突。 我可以(而且人们通常会这样做,因为病媒具有若干不同的含义)界定了我自己的<条码> 类别,并且与<条码>std:vector有冲突。

因此,你的名字空间如何被深层nes? 我倾向于像标准图书馆这样的东西加一比。 • 为一切目的创造新的名称空间,并缩短名称。

也许所有公司代码都使用一个共同的根基空间,即<代码>Cpy。

根据这一规定,每个产品都有一个名称空间,即<代码>Prod。 以及过去? 您的每个主要组成部分(Comp)都有一个名称空间,而且这一空间基本上也属于这一空间。

这里的重要事情是,你实际上从来没有提及最外名空间。 页: 1 我几乎从未需要写到<代码>Cpy:Prod:Comp,因为我的代码已经放在头两个名称空间。 如果情况如此,名称空间结构就会太长,太深。

Then I sometimes do like Boost, and create small "internal" helper namespaces, typically called Aux or Util or similar. These should be small, and should only ever be accessed from their immediate parent namespace. A specific component might have a few classes that are for internal use only. So they are tucked away in a small Aux namespace, mainly to keep them hidden from others that reference our component.

当然,你可能会问,最外围的“公司”名称空间究竟有什么目的。 难道说我们的所有法典都好是我们的公司吗? 第三方代码通常(hopeful)位于其自己的名称空间(say,boost:),即使没有公司名称空间,我们也会冒着任何冲突的风险。 您不妨删除。

另一个需要考虑的事项是,如果你重新撰写供外部使用的图书馆部件,则名称空间结构应为 甚至缩短<>。 在公司内,你可以假定,每个人都已经在“公司”名称空间内写成密码,因此他们永远不必打出名称。 它基本上属于“自由”。 但是,如果外部用户必须提及你的代码,那么,这是他们必须打出的另外一层名称空间,这种空间已经迅速老。 整体“产品”名称空间可能是不可避免的(类似于stdboost),但你可能希望尽可能避免“产品”名称空间。 (Again,与两者一样,后者很少在根本名称下建立次名称空间)

底线是,您的国名空间必须是practical <>em>和usable。 如果你迫使用户在名称空间预设物中排出超过8个特性,就会失去意义,而且他们只是开始在任何地方使用<条码>。 您实际上只有need 称号空间,否则你会发生名字碰撞。 你们的控制权永远不应与第三方代码共用一个名称空间,因为你对自己增加的名字没有控制权(通常,第三方的校准通过将其图书馆放在一个共同的根基空间,例如<条码>。 但是,在你控制的法典中,有的只有,许多碰撞。 因此,没有比你实际需要确定更多的名称空间。

我认为,这是非常主观的,你可能会收到许多不同的意见,因此,这里要!:

Nested namespaces - good. One large namespace - horrible.

以上是真正的世界(即,非常庞大的法典基础)。 为防止区域空间倡议,考虑短名空名!

EDIT:一个例子,它非常主观,其他人将采取不同的做法......

请允许我说,在 Java,你为公司oo而工作,通常你开始做 com,而是使用oo。

namespace foo
{

}

现在,所有公司代码都位于一个名称空间,然后考虑任何共同的缺点:

namespace foo
{
  namespace com
  {
    // any communication stuff goes here
    namespace msg
    {
      // let s say you have some form of messages that you send
    } // msg
    namespace con
    {
      // wraps all your connectivity
    } // con
  } // com

  namespace util
  {
    // utilities
    // you may not need to break this up further
  } // util
} // foo

现在请说你们有项目,在项目上给它自己的名称空间。

namespace foo
{
  namespace proj
  {
    // all projects are here
    namespace bob
    {
      // all bob s stuff is here, break it up as you need (though I wouldn t bother unless you have hundred s of classes where collisions are likely), I d rather organise the files in the file system appropriately and keep the classes in the same namespace.
    } // bob

  } // proj
} // foo

For me, simply put I have no problem with using namespaces in index files, but I will never hardly use them in .h or header files because alot of times things get changed or added on so having one big namespace may be a big mistake. However for smaller seperate files having smaller seperate namespaces isn t too harmful I dont think.





相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?