我来自c#背景,其中所有内容都有自己的命名空间,但这种做法在c ++世界中似乎并不常见。我应该将代码包装在自己的命名空间,未命名的命名空间中,还是没有命名空间?
答案 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.
整本指南值得一读,但总结一下,他们说:
} // 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语言相比)。