代码之家  ›  专栏  ›  技术社区  ›  Abtin Forouzandeh

我应该把我所有的C++代码包在自己的命名空间中吗?

  •  26
  • Abtin Forouzandeh  · 技术社区  · 15 年前

    我来自一个C背景,所有的事物都有自己的命名空间,但是这种实践在C++世界中似乎并不常见。我应该将代码包装在它自己的名称空间、未命名的名称空间或没有名称空间中吗?

    8 回复  |  直到 15 年前
        1
  •  35
  •   Johannes Schaub - litb    15 年前

    很多C++开发人员都不使用命名空间。当我开始使用C++时,我没有使用它们很长时间,直到我得出结论,我可以更好地使用命名空间。

    许多库通过在名称前加前缀来绕过名称空间。例如,wxwidgets将字符“wx”放在所有内容之前。qt把“q”放在一切之前。这并不是什么真正的错误,但它要求您重新输入前缀,即使它可以从上下文推断出您所指的声明。命名空间具有层次结构顺序。在词法上更接近引用它们的点的名称可以在前面找到。因此,如果您在GUI框架中引用“window”,它将找到“my::gui::window”,而不是“::window”。

    名称空间使一些很好的功能无法在没有它们的情况下使用。例如,如果将类放入一个名称空间,则可以在该名称空间内定义自由函数。然后,通过导入所有名称,或者选择性地将其中的一些名称放入当前作用域(“using声明”),在不将名称空间放在前面的情况下调用函数。

    现在,我不用它们就不做任何项目了。它们使得不再输入相同的前缀变得非常容易,但是仍然具有良好的组织性和避免全球名称空间的名称污染。

        2
  •  11
  •   Robert Gould    15 年前

    取决于,如果您的代码是库代码,请将其封装在命名空间中,这是C++中的实践。如果您的代码只是一个非常简单的应用程序,不与其他任何东西交互,比如Hello World之类的应用程序,那么就不需要名称空间,因为它是多余的。

    而且,由于不需要名称空间,Web上的代码片段和示例很少使用它们,但大多数实际项目确实使用它们。

        3
  •  4
  •   Abtin Forouzandeh    15 年前

    我刚刚发现了谷歌的C++风格指南 namespace guidelines.

    整个指南值得一读,但总的来说,他们说:

    • 将未命名的命名空间添加到.cc文件,而不是.h文件。
    • 将整个.cc和.h文件(在includes/declarations之后)包装在命名命名空间中。
    • 命名空间不会增加缩进级别。
    • 在命名空间写入的右大括号处 } // namespace .
    • 不要申报任何东西 std ,因为它是未定义的。
    • 使用 using 禁止使用指令。
    • 这个 使用 函数、方法和类中允许声明。
    • 任何地方都允许使用命名空间别名。
        4
  •  2
  •   Andrew Grant    15 年前

    这真的取决于你是否期望会有冲突。

    两种情况;

    1)如果您创建的代码可能会被其他人(如库)使用,那么可能会出现命名空间冲突,因此最好使用自己的命名空间。

    2)如果您使用的是第三方库,则它们的代码可能没有名称空间,并且可能与您的代码冲突。

    我还想说,如果您希望您的代码能够足够大并覆盖许多不同的领域(数学/物理/渲染),那么使用名称空间确实可以使代码更容易搜索,特别是对于那些没有明显分类的类型。

        5
  •  2
  •   jturcotte    15 年前

    我们在托管C++的包代码中遇到了问题,这里使用了我们的公共库。

    有些类与.NET库中的系统类(即System.Console)具有相同的名称。
    我们必须做一些丑陋的宏补丁来解决这些问题。

    一开始使用名称空间就可以避免这种情况。

        6
  •  1
  •   sharptooth    15 年前

    只有在存在名称冲突风险的情况下才真正需要名称空间-某些全局可见的函数、变量或类被定义了多次。否则,您可以在没有名称空间的情况下做得很好——只需命名类,这样它们就不会复制运行时库类,并使全局函数/变量成为一些合理类的静态成员。

        7
  •  1
  •   David R Tribble    15 年前

    我会说这是一个好主意,如果没有其他原因的话,那就是在与其他第三方代码混合时,不要让你的东西被踩到。

    我尽量将尽可能多的变量和函数放入类中,这样做会更进一步。但这有时比它应该做的要困难(与其他OO语言相比)。

        8
  •  1
  •   Reto Meier    15 年前

    但这种做法似乎是 在C++世界中不常见

    真的?我看到的所有代码似乎都包装在一个名称空间中。
    我使用Java中看到的相同类型的约定(除了删除COM)。

    在爪哇

    package com.<Company>.<Product>.<Package>;
    

    在C++中

    namespace <Company>
    {
         namespace <Product>
         {
             namespace <Package>
             {
             }
         }
     }