所以,我已经看到命名空间可以将声明组织到各自的组中,但现在出现了问题。
在C语言中创建库和在C ++中创建库之间的区别在于你必须在声明前面添加它们所属的内容,例如我们要复制的库MyMath可能有一个矢量类,这个名字可能是MM_Vector。
在C ++中,您将拥有一个命名空间MyMath,并将Vector类声明为其一部分。
现在这里的区别在于C,只需进入类声明,您就会立即知道如何使用它。在C ++中,您必须检查特定类所属的命名空间(实际上只是声明不在命名空间声明附近的文件中的问题,如果在两者之间声明了常量和枚举,这可能很常见)。虽然我更喜欢使用命名空间进行组织,但在我看来,这仍然是一个有效的争论。
人们为减轻这种烦恼做了什么?
答案 0 :(得分:2)
使用提供快速提示和符号导航的IDE和/或使用文档生成器(例如Doxygen)。
答案 1 :(得分:2)
“在声明不在命名空间声明附近的文件中只有一个问题,如果在两者之间声明了常量和枚举,这可能很常见。”
如果这困扰你,请执行以下操作:
namespace MyMath {
constants and enumerations go here
}
namespace MyMath {
class goes here
}
namespace MyMath {
another class goes here
}
与类不同,您不必一起定义命名空间。括号并不意味着“这就是所有东西”,它们只是表示所有定义都在该命名空间中的范围,并且所有符号都在命名空间中查找。
答案 2 :(得分:2)
在his book的第8章中,Stroustrup建议使用如下样式:
MyMath.h
namespace MyMath {
class Vector;
};
<强> Vector.h 强>
#include "MyMath.h"
class MyMath::Vector {
public:
Vector();
// ...
};
<强> Vector.cc 强>
#include "Vector.h"
MyMath::Vector::Vector() { /* ... */ }
将开放的名称空间声明限制为其内容的声明会产生简短的摘要。完全限定的定义允许编译器捕获拼写错误。
应用于您的关注点时,此样式中的类声明和定义使每个类的父命名空间变得清晰 - 以Go人称之为stuttering为代价。
答案 3 :(得分:0)
应该没有问题。只需确保任何标头中都没有using
语句,并且没有单片源文件。如果这是一个大问题,请完全符合您的课程资格。
答案 4 :(得分:0)
您描述的问题归结为您所处的心态。在开发代码时,您知道您正在使用MyMath::Vector
,所以您有兴趣看到尽可能少的混乱,并添加using namespace MyMath;
或using MyMath::Vector;
子句。
几个月之后,有人会进入您的代码,而不会知道Vector
来自哪个命名空间。他可能会争辩(正如你所做的)这个using
声明会使代码变得不易理解。
这就是优秀IDE的用武之地:您可以将命名空间(对于大型系统来说可能变得非常大),但在调试/编辑代码时,IDE可以完美地暗示符号所在的位置声明,定义,引用等...