Pomijanie subtelnie odmiennej semantyki z powodu ADL, jak ogólnie powinienem używać using
i dlaczego? Czy to zależy od sytuacji (np. Nagłówek, który będzie #include
d kontra plik źródłowy, który nie będzie)?
Należy również podkreślić, wolę ::std::
albo std::
?
Poziom przestrzeni nazw
using namespace
:using namespace std; pair<string::const_iterator, string::const_iterator> f(const string &s) { return make_pair(s.begin(), s.end()); }
Będąc w pełni jawnym:
std::pair<std::string::const_iterator, std::string::const_iterator> f(const std::string &s) { return std::make_pair(s.begin(), s.end()); }
Deklaracje użycia na poziomie przestrzeni nazw:
using std::pair; using std::string; pair<string::const_iterator, string::const_iterator> f(const string &s) { return make_pair(s.begin(), s.end()); }
Lokalne funkcje-deklaracje użycia:
std::pair<std::string::const_iterator, std::string::const_iterator> f(const std::string &s) { using std::make_pair; return make_pair(s.begin(), s.end()); }
Funkcja lokalna
using namespace
:std::pair<std::string::const_iterator, std::string::const_iterator> f(const std::string &s) { using namespace std; return make_pair(s.begin(), s.end()); }
Coś innego?
Zakłada się, że jest to wersja wcześniejsza niż C ++ 14, a zatem nie stosuje się dedukcji typu zwrotu auto
.
::std::
vs.std::
chociaż.std
bez sekundy. Ktoś definiujący przestrzeń nazw std prosi o kłopoty (i prawdopodobnie stara się skorzystać, że większość ludzi używa,std
a nie używa::std
).Odpowiedzi:
Unikaj używania
using
w nagłówkach, ponieważ narusza to cel przestrzeni nazw.Można go używać w plikach źródłowych, ale w niektórych przypadkach nadal go unikałbym (na przykład
using std
).Jeśli jednak masz zagnieżdżone przestrzenie nazw, jest w porządku:
źródło
using
słowa kluczowego bez dokładnego wyjaśnienia, dlaczego na początku używa się przestrzeni nazw.using std::cout
i przyjaciele, ale to już nie takcout
strasznie długie imię.Umieszczając instrukcję using w pliku źródłowym, PROSZĘ, po prostu ściągnij to, czego potrzebujesz. Na przykład:
Problem polega na tym, że jeśli to zrobisz
wciągasz KAŻDĄ POJEDYNCZĄ RZECZ ze standardowego obszaru nazw do globalnej przestrzeni nazw. Co prowadzi do bardzo interesujących komunikatów o błędach, gdy przypadkowo użyjesz w kodzie nazwy, która odpowiada tej, o której nie wiedziałeś w standardzie. Jeśli po prostu wciągniesz to, co chcesz, nie będziesz miał tego problemu (a ściślej mówiąc, następny programista, który będzie pracował nad twoim kodem, nie będzie miał tego problemu).
źródło
using namespace
po prostu w zakresie funkcji, unikając problemu.Jak wskazuje VJovic, nie należy używać
using
w pliku nagłówkowym.using
w pliku nagłówkowym wpływa na bieżącą jednostkę kompilacji (plik .cpp) w sposób, którego plik źródłowy może nie oczekiwać.using namespace
należy również unikać w pliku źródłowym. To przenosi każdy symbol do tego samego zakresu co plik źródłowy. Bardziej jasne dla czytelników jest to, co robisz, jeśli używasz określonych symboli z przestrzeni nazw.źródło
using namespace JoystickModule
na początku pliku .cpp niżJoystickModule::
dołączyć do każdego obiektu.using
instrukcja dla mojej własnej przestrzeni nazw, nad którą obecnie pracuję, a wszystko inne pozostaje w przestrzeni nazw.using SomeNameSpace::SomeSymbol
. Pozwala to uniknąć przenoszenia każdego symbolu z przestrzeni nazw do bieżącego zakresu.Pisanie
using
w Nagłówkach to najlepszy sposób na tworzenie wszelkiego rodzaju nieprzyjemnych i niemożliwych do debugowania błędów. Czy nie to zrobić.Pisanie
using namespace XYZ
w pliku źródłowym jest trochę lepsze, ale wciąż może powodować niezliczone bóle głowy. Bezpiecznym sposobem jest wyraźne określenie, czego używasz, npusing Foo::Bar
.Załóżmy, że masz plik Bar.cpp z następującymi elementami:
Funkcja działała dobrze, aż pewnego dnia - pozornie bez żadnych zmian kodu w odpowiednich klasach - jej zachowanie się zmieniło: nagle nagle
currentIndex
wydaje się, że jest wyłączony o jeden . Przeglądając ostatnie zmiany nie odkryjesz żadnych zmian, nawet zdalnie związanych z kodem.W końcu odkrywasz przyczynę:
Ty (pośrednio) jesteś
Foo.h
gdzieś. W plikach przestrzeni nazw Foo dodano nową funkcję:Który jest zdecydowanie lepszy
increment(int)
niż twoja funkcjaincrement(double)
- więc terazFoo::increment()
funkcja jest wywoływana przezBar::someFunction()
. Ups(A gdybyś napisał
using
w Nagłówkach, któreusing namespace Foo
równie dobrze mogą znajdować się w dowolnym miejscu twojego drzewa dołączeń ...)Więc ... Nie pisz żadnych
using
w Nagłówkach, a także uważaj na pisanieusing namespace
w plikach źródłowych.źródło