Namespaces (C++)
A linguagem C++ fornece um único namespace global. Isso pode causar problemas com conflitos globais de nome. Por exemplo, considere esses dois arquivos de cabeçalho C++:
char func(char);
class String { ... };
// somelib.h
class String { ... };
Com essas definições, é impossível usar ambos os arquivos de cabeçalho em um único programa; as classes String entrarão em conflito.
Um namespace é uma região declarativa que anexa um identificador adicional a todos os nomes declarados nele. O identificador adicional torna menos provável o conflito de um nome com os nomes declarados em outro lugar no programa. É possível usar o mesmo nome em namespaces separados sem conflito, mesmo que os nomes apareçam na mesma unidade de tradução. Contato que aparecem em namespaces separados, cada nome será exclusivo devido à adição de identificador de namespace. Por exemplo:
namespace one {
char func(char);
class String { ... };
}
// somelib.h
namespace SomeLib {
class String { ... };
}
No entanto, os nomes de classe não entrarão em conflito pois eles se tornam one::String e SomeLib::String, respectivamente.
O C++ não permite nomes compostos para namespaces.
// pluslang_namespace.cpp
// compile with: /c
// OK
namespace a {
namespace b {
int i;
}
}
// not allowed
namespace c::d { // C2653
int i;
}
As declarações de arquivo no escopo de uma unidade de tradução, fora de todos os namespaces, ainda são membros do namespace global.