污染全局命名空间

时间:2008-11-06 08:03:55

标签: c++ namespaces typedef

我认为这里的大多数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 个答案:

答案 0 :(得分:7)

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

using ns::MY_TYPE;

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:4)

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

当多个人在应用程序上工作时,您当然需要明确的规则,最明确的规则是“不要”。但是,这并非在所有情况下都是理想的。

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

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

YMMV拥有一个庞大的团队或一个巨大的项目,进入一个单一的编译。

答案 3 :(得分:3)

我完全不同意使用全局命名空间(当然,除了main之外)。对于在整个应用程序中使用的内容,您只需在所有相关using namespace行之后的.cpp文件顶部使用#include