The C++ language provides a single global namespace. This can cause problems with global name clashes. For instance, consider these two C++ header files:
With these definitions, it is impossible to use both header files in a single program; the String classes will clash.
A namespace is a declarative region that attaches an additional identifier to any names declared inside it. The additional identifier makes it less likely that a name will conflict with names declared elsewhere in the program. It is possible to use the same name in separate namespaces without conflict even if the names appear in the same translation unit. As long as they appear in separate namespaces, each name will be unique because of the addition of the namespace identifier. For example:
namespace one { char func(char); class String { ... }; } // somelib.h namespace SomeLib { class String { ... }; }
Now the class names will not clash because they become one::String and SomeLib::String, respectively.
C++ does not allow compound names for namespaces.
// pluslang_namespace.cpp // compile with: /c // OK namespace a { namespace b { int i; } } // not allowed namespace c::d { // C2653 int i; }
Declarations in the file scope of a translation unit, outside all namespaces, are still members of the global namespace.