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

时间:2009-02-02 07:24:23

标签: c# c++ namespaces

我来自c#背景,其中所有内容都有自己的命名空间,但这种做法在c ++世界中似乎并不常见。我应该将代码包装在自己的命名空间,未命名的命名空间中,还是没有命名空间?

8 个答案:

答案 0 :(得分:35)

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

许多库通过在名称前添加前缀来解决名称空间。例如,wxWidgets将字符“wx”放在所有内容之前。 Qt把“Q”放在一切之前。这并没有什么不妥,但是它需要你再次输入那个前缀,即使它可以从上下文中推断出你所说的声明。命名空间具有分层次序。在词法上更接近引用它们的点的名称可以在之前找到。因此,如果您在GUI框架中引用“Window”,它将找到“my :: gui :: Window”,而不是“:: Window”。

命名空间启用了一些不带它们就无法使用的好功能。例如,如果将类放入命名空间,则可以在该命名空间中定义自由函数。然后调用函数,而不是通过导入所有名称将命名空间放在前面,或者有选择地只将其中一些命名空间放入当前范围(“using declaration”)。

如今,如果不使用它们,我就不再做任何项目了。它们使得不再重复键入相同的前缀变得如此容易,但仍然具有良好的组织和避免全局命名空间的名称污染。

答案 1 :(得分:11)

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

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

答案 2 :(得分:4)

我刚刚发现了Google的c ++风格指南,他们有namespace guidelines.

整本指南值得一读,但总结一下,他们说:

  • 将未命名的命名空间添加到.cc文件,但不添加.h文件。
  • 在命名的命名空间中包装整个(在包含/声明之后).cc和.h文件。
  • 命名空间不会增加缩进级别。
  • 在命名空间的右括号中写} // namespace
  • 不要在std中声明任何内容,因为它未定义。
  • 禁止使用using指令。
  • 函数,方法和类中允许using声明。
  • 任何地方都允许使用名称空间别名。

答案 3 :(得分:2)

这实际上取决于你是否预期会有任何冲突。

两种情况;

1)如果您正在创建可能被其他人使用的代码(例如库),那么可能存在命名空间冲突,因此使用您自己的命名空间是一个好主意。

2)如果您使用的是第三方库,则其代码可能不是命名空间,可能与您的代码冲突。

我还想说,如果你希望你的代码很大并覆盖许多不同的领域(数学/物理/渲染),那么使用命名空间会使代码更易于理解,特别是对于那些没有明显分类的类型。

答案 4 :(得分:2)

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

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

在开头使用命名空间会阻止这种情况。

答案 5 :(得分:1)

如果存在名称冲突的风险,您只需要名称空间 - 一些全局看到的函数或变量或类被定义多次。否则你就没有命名空间就行了 - 只需命名你的类,使它们不重复运行时库类,并使全局函数/变量成为某些合理类的静态成员。

答案 6 :(得分:1)

  

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

真。我看到的所有代码似乎都包含在命名空间中 我使用与我在Java中看到的相同类型的约定(除了我删除它)。

在Java中

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

在C ++中

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

答案 7 :(得分:1)

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

我尝试通过将尽可能多的变量和函数放入类中来进行更远的操作。但这有时比应该做的更难(与其他OO语言相比)。