1

所以,我已经看到命名空间在将声明组织到各自的组中是多么有用,但现在出现了一个问题。

在 C 中创建库和在 C++ 中创建库之间的区别在于,在 C 中,您必须在声明前加上它们所属的前缀,例如,我们将命名为 MyMath 的库可能有一个向量类,名称可能是 MM_Vector。

在 C++ 中,您将拥有一个命名空间 MyMath,其中声明了一个 Vector 类作为它的一部分。

现在这里的区别在于 C,只需转到类声明,您就会立即知道如何使用它。在 C++ 中,您必须检查特定类属于哪个命名空间(实际上只有在声明不在​​命名空间声明附近的文件中存在问题,如果在两者之间声明了常量和枚举,这可能很常见)。虽然我更喜欢使用命名空间来组织,但在我看来,这仍然是一个有效的论点,因为它很烦人。

人们做了什么来减少这种烦恼?

4

5 回答 5

2

使用提供快速提示和符号导航的 IDE 和/或使用文档生成器(例如 Doxygen)。

于 2009-12-01T18:08:06.477 回答
2

“只有声明不在命名空间声明附近的文件中存在问题,如果在两者之间声明了常量和枚举,这可能很常见)。”

如果这让您感到困扰,请执行以下操作:

namespace MyMath {
    constants and enumerations go here
}

namespace MyMath {
    class goes here
}

namespace MyMath {
    another class goes here
}

与类不同,您不必一起定义命名空间。括号并不意味着“这就是一切”,它们只是表示一个范围,其中所有定义都在该命名空间中,并且所有符号都在命名空间中查找。

于 2009-12-01T18:38:17.467 回答
2

他的书的第 8 章中,Stroustrup 推荐了如下风格:

MyMath.h

namespace MyMath {
  class Vector;
};

矢量.h

#include "MyMath.h"

class MyMath::Vector {
  public:
  Vector();
  // ...
};

矢量.cc

#include "Vector.h"

MyMath::Vector::Vector() { /* ... */ }

将开放的命名空间声明限制为对其内容的声明会产生简短的摘要。完全限定的定义允许编译器捕捉错别字。

正如您所关注的那样,这种风格的类声明和定义明确了每个类的父命名空间——以牺牲 Go 人所说的 stuttering为代价。

于 2009-12-01T18:40:38.483 回答
0

应该没有问题。只要确保using在任何标题中都没有语句,并且没有单一的源文件。如果这是一个大问题,请完全限定您的课程。

于 2009-12-01T18:12:35.193 回答
0

您描述的问题归结为您所处的心态。在开发代码时,您非常清楚您正在使用MyMath::Vector,因此您有兴趣看到尽可能少的混乱,并添加一个using namespace MyMath;orusing MyMath::Vector;子句。

仅仅几个月后,有人进入您的代码,并且知道Vector来自哪个命名空间。他可能会争辩(就像你所做的那样)这个using声明使代码更难理解。

这就是优秀 IDE 的用武之地:您可以将命名空间(对于大型系统来说可能会变得非常大)留出,但是在调试/编辑代码时,IDE 可以完美地提示您在哪里声明、定义了符号, 引用等...

于 2009-12-01T18:21:46.660 回答