Ein wichtiges Mittel zur Organisation von Code sind Namespaces.
Zwei Funktionen können einen Namenskonflikt haben, der sich lösen lässt, indem man sie in verschiedene Namespaces packt.
Namespaces lassen sich verschachteln, was helfen kann, große Codebasen zu strukturieren.
Auf die Namespaces greifst du über den Operator :: zur Auflösung des Gültigkeitsbereichs zu.
Das folgende Beispiel zeigt die Verwendung zweier verschiedener foo-Funktionen.
Sie werden gemeinsam verwendet, indem man ihnen ihren jeweiligen Namespace voranstellt.
namespace my_ns {
int foo() {
return 44;
}
namespace my_inner_ns {
int baz() {
return 90;
}
}
}
namespace my_other_ns {
int foo() {
return -2;
}
}
int myresult{my_ns::foo() + my_other_ns::foo() * my_ns::my_inner_ns::baz()};
Tief verschachtelte Namespaces können unnötig ausführlich werden.
Du kannst die Ausführlichkeit mit einem Namespace-Import über using beseitigen.
Dabei werden alle Namen in den globalen Namespace verschoben.
Um eine gewisse Unterscheidung zu behalten, sind Aliase hilfreich.
int my_other_result{my_ns::my_inner_ns::baz()};
using namespace my_ns::my_inner_ns; // importing the complete namespace
int also_other_result{baz()};
namespace m = my_ns; // setting an alias
namespace o = my_other_ns;
int also_my_result{m::foo() + o::foo() * m::my_inner_ns::baz()};