2

我认为这里的大多数 C++ 程序员都会同意污染全局命名空间是一个坏主意,但是有时可以忽略此规则吗?

例如,我有一个需要在整个特定应用程序中使用的类型 - 我应该这样定义它:

mytypes.h

typedef int MY_TYPE;

foo.cpp

MY_TYPE myType;

或者使用命名空间:

mytypes.h

namespace ns {
typedef int MY_TYPE;
}

foo.cpp

ns::MY_TYPE myType;
...
using namespace ns;
MY_TYPE myType;

你喜欢哪个?有时可以接受使用第一种方法吗?

4

4 回答 4

7

您可以在单独的命名空间中定义您的类型,并使用

using ns::MY_TYPE;
于 2008-11-06T08:12:36.267 回答
4

我使用命名空间将库代码与特定于应用程序的代码分开,并在一个大项目中对构成项目的各种模块进行分区。

因此,全局命名空间对于跨应用程序中的多个模块使用的特定于应用程序的类型和函数很有用。

因此,如果您MY_TYPE在整个应用程序中使用,请将其放在全局命名空间中,否则将其放在命名命名空间中。

于 2008-11-06T08:09:51.670 回答
4

图书馆不得,应用程序可以。

当多人处理一个应用程序时,当然需要明确的规则,最明确的规则是“不要”。然而,这并不是在所有情况下都是理想的。

“使用”语句应该只在 CPP 文件之上,而不是在头文件中——但这会使编写模板变得复杂,因为——对于不久的将来的大多数编译器——它们需要驻留在头文件中。

以我的经验(大多数是小型团队,拥有一个大型但分区良好的项目),只要您控制相应的代码并坚持使用描述性名称,命名空间污染就不是什么大问题。我记得的案件很少,而且很容易处理。但是,第三方库存在重大问题 - 即使有可用的源代码。

YMMV 拥有庞大的团队或大型项目,只需一次编译。

于 2008-11-06T13:53:34.703 回答
3

我根本不同意使用全局命名空间(main当然,除了 )。对于在整个应用程序中使用的东西,您可以简单地using namespace在文件顶部使用.cpp,在所有相关#include行之后。

于 2008-11-06T08:12:08.560 回答