污染全局命名空间

Rob*_*Rob 2 c++ typedef namespaces

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

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

mytypes.h

typedef int MY_TYPE;

foo.cpp

MY_TYPE myType;
Run Code Online (Sandbox Code Playgroud)

或使用命名空间:

mytypes.h

namespace ns {
typedef int MY_TYPE;
}

foo.cpp

ns::MY_TYPE myType;
...
using namespace ns;
MY_TYPE myType;
Run Code Online (Sandbox Code Playgroud)

你喜欢哪个?是否有可能使用第一种方法?

Igo*_*nov 7

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

using ns::MY_TYPE;
Run Code Online (Sandbox Code Playgroud)


Ant*_*ams 5

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

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

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


pet*_*hen 5

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

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

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

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

YMMV 拥有一个庞大的团队或一个大型项目,需要进行一次编译。