Vincent Robert ma rację w swoim komentarzu Jak prawidłowo używać przestrzeni nazw w C ++? .
Korzystanie z przestrzeni nazw
Przestrzenie nazw są używane przynajmniej w celu uniknięcia kolizji nazw. W Javie jest to wymuszane przez idiom „org.domain” (ponieważ przypuszcza się, że nie użyje się niczego poza własną nazwą domeny).
W C ++ można nadać przestrzeń nazw dla całego kodu w module. Na przykład dla modułu MyModule.dll można nadać jego kodowi przestrzeń nazw MyModule. Widziałem gdzie indziej kogoś używającego MyCompany :: MyProject :: MyModule. Myślę, że to przesada, ale w sumie wydaje mi się to poprawne.
Za pomocą „za pomocą”
Używanie powinno być stosowane z dużą ostrożnością, ponieważ skutecznie importuje jeden (lub wszystkie) symbole z przestrzeni nazw do bieżącej przestrzeni nazw.
Złe jest to robić w pliku nagłówkowym, ponieważ nagłówek będzie skaził każde źródło, w tym (przypomina mi makra ...), a nawet w pliku źródłowym zły styl poza zakresem funkcji, ponieważ będzie importować w zakresie globalnym symbole z przestrzeni nazw.
Najbezpieczniejszym sposobem użycia „za pomocą” jest zaimportowanie wybranych symboli:
void doSomething()
{
using std::string ; // string is now "imported", at least,
// until the end of the function
string a("Hello World!") ;
std::cout << a << std::endl ;
}
void doSomethingElse()
{
using namespace std ; // everything from std is now "imported", at least,
// until the end of the function
string a("Hello World!") ;
cout << a << endl ;
}
Zobaczysz wiele „za pomocą przestrzeni nazw std;” w samouczku lub przykładowych kodach. Powodem jest zmniejszenie liczby symboli, aby ułatwić czytanie, nie dlatego, że jest to dobry pomysł.
„using namespace std;” jest zniechęcany przez Scotta Meyersa (nie pamiętam dokładnie, która książka, ale w razie potrzeby mogę ją znaleźć).
Skład przestrzeni nazw
Przestrzenie nazw to więcej niż paczki. Kolejny przykład można znaleźć w „The C ++ Programming Language” Bjarne Stroustrup.
W „Edycji specjalnej”, w 8.2.8 Skład przestrzeni nazw , opisuje, w jaki sposób można połączyć dwie przestrzenie nazw AAA i BBB w inną zwaną CCC. W ten sposób CCC staje się aliasem zarówno dla AAA, jak i BBB:
namespace AAA
{
void doSomething() ;
}
namespace BBB
{
void doSomethingElse() ;
}
namespace CCC
{
using namespace AAA ;
using namespace BBB ;
}
void doSomethingAgain()
{
CCC::doSomething() ;
CCC::doSomethingElse() ;
}
Możesz nawet importować wybrane symbole z różnych przestrzeni nazw, aby zbudować własny interfejs przestrzeni nazw. Nie znalazłem jeszcze praktycznego zastosowania tego, ale teoretycznie jest fajnie.
std
przestrzeni nazw symbolami niżusing
w ogóle używania . Więc zawsze piszęstd::cout
lubstd::string
teraz, bo tak je teraz nazywam. Nigdy bym po prostu nie napisałcout
.