To pytanie może być duplikatem, ale nie mogę znaleźć dobrej odpowiedzi. Krótkie i proste, co wymaga ode mnie zadeklarowania w programach C++, aby móc zadeklarować Co wymaga ode mnie deklaracji "using namespace std;"?
Odpowiedz
Ponieważ ++ standard C została przyjęta, praktycznie wszystkie biblioteki standardowej jest wewnątrz przestrzeni nazw std. Jeśli więc nie chcesz kwalifikować wszystkich wywołań biblioteki standardowej za pomocą std::
, musisz dodać dyrektywę using.
Jednak
using namespace std;
jest uważane za złą praktyką, ponieważ są praktycznie cały importowania nazw standardowych, otwierając w ten sposób wiele możliwości nazwy starć. Lepiej jest importować tylko rzeczy używanemu w rzeczywistości w kodzie, jak
using std::string;
Nic nie robi, to jest skrótem uniknąć poprzedzając wszystko w tej przestrzeni nazw z std ::
A także uważany za kiepską praktykę. – GManNickG
jego słaba praktyka, jeśli robisz to globalny obszar nazw: D –
@GMan, @Hassan: To jest całkiem w porządku, aby użyć go w plikach implementacyjnych i niebezpieczny w plikach nagłówkowych. Dlaczego wszyscy mówią "słabą praktykę"? Nie chciałbym pracować nad kodem, w którym muszę wpisywać 'std ::' wszędzie, tak samo jak nie chciałbym importować żadnej przestrzeni nazw pośrednio z 'using namespace some_tools;' – Potatoswatter
Możliwość odnoszą się do członków w przestrzeni nazw std
bez potrzeby odwoływania się do std::member
wyraźnie. Na przykład:
#include <iostream>
using namespace std;
...
cout << "Hi" << endl;
vs.
#include <iostream>
...
std::cout << "Hi" << std::endl;
Przede wszystkim nie jest to wymagane w C - C nie mają nazw. W C++, wszystko w przestrzeni nazw std
, które obejmuje większość biblioteki standardowej. Jeśli nie to zrobić trzeba uzyskać dostęp do członków nazw wyraźnie tak:
std::cout << "I am accessing stdout" << std::endl;
Wszystkie pliki w folderze C++ biblioteki standardowej deklarować wszystkich swoich jednostek w przestrzeni nazw std.
np: Aby korzystać cin,cout
zdefiniowane w iostream
Alternatywy:
using std::cout;
using std::endl;
cout << "Hello" << endl;
std::cout << "Hello" << std::endl;
jest używany, gdy używasz coś, co jest zadeklarowane w przestrzeni nazw. Biblioteka standardowa C++ jest zadeklarowana w standardowej przestrzeni nazw. Dlatego trzeba zrobić
using namespace std;
chyba że chcesz określić obszar nazw podczas wywoływania funkcji w innej przestrzeni nazw, tak jak poniżej:
std::cout << "cout is declared within the namespace std";
Możesz przeczytać więcej na ten temat na http://www.cplusplus.com/doc/tutorial/namespaces/.
Po pierwsze, dyrektywa using
nigdy nie jest wymagana w C, ponieważ C w ogóle nie obsługuje przestrzeni nazw.
nigdy faktycznie Dyrektywa using
jest wymagane w C++, ponieważ każdy z elementów znajdujących się w przestrzeni nazw można uzyskać bezpośrednio poprzedzając je std::
zamiast. Tak więc, na przykład:
using namespace std;
string myString;
odpowiada:
std::string myString;
, czy zdecydujesz się go użyć, jest kwestią wyboru, ale naraża całą std
nazw zaoszczędzić kilka klawiszy jest na ogół uważane za złą formę. Alternatywną metodą, która eksponuje tylko poszczególne elementy w przestrzeni nazw jest następująca:
using std::string;
string myString;
To pozwala wystawiać tylko elementy w std
nazw, które szczególnie potrzebują, bez ryzyka narażania nieumyślnie coś ty nie zamierzać.
Nigdy nie musisz zadeklarować używając przestrzeni nazw std; stosując to jest złą praktyką i należy użyć std :: jeśli nie chcesz pisać std :: zawsze można zrobić coś takiego w niektórych przypadkach:
using std::cout;
Używając std :: można również powiedz, która część twojego programu używa standardowej biblioteki, a która nie. Co jest jeszcze ważniejsze, że mogą pojawić się konflikty z innymi funkcjami, które zostaną uwzględnione.
Rgds Layne
To jest tylko zła praktyka w globalnej przestrzeni nazw w plikach nagłówkowych. W plikach implementacyjnych często jest to dobry pomysł. Zapisywanie pisania jest nieistotne - twój redaktor powinien za ciebie pisać.Jest to dobre, ponieważ sprawia, że kod jest bardziej czytelny niż "std ::" wszędzie i jest łatwiejszy do utrzymania niż trzydzieści linii 'using std :: whatever;' na górze każdego pliku. – Porculus
Nie należy zdecydowanie powiedzieć:
using namespace std;
w nagłówkach C++, bo bije cały punkt przy użyciu przestrzeni nazw (robi to stanowiłoby "zanieczyszczenie przestrzeni nazw"). Kilka przydatnych zasobów na ten temat są następujące: gwint
1) stackoverflow na Standard convention for using “std”
2) artykuł Herb Sutter na Migrating to Namespaces
3) FAQ 27.5 z Marshall Cline na C++ FAQ Lite.
Przestrzenie nazw są sposobem na zawijanie kodu w celu uniknięcia pomyłek i sprzecznych nazw. Na przykład:
common1.h Plik:
namespace intutils
{
int addNumbers(int a, int b)
{
return a + b;
}
}
wykorzystanie pliku:
#include "common1.h"
int main()
{
int five = 0;
five = addNumbers(2, 3); // Will fail to compile since the function is in a different namespace.
five = intutils::addNumbers(2, 3); // Will compile since you have made explicit which namespace the function is contained within.
using namespace intutils;
five = addNumbers(2, 3); // Will compile because the previous line tells the compiler that if in doubt it should check the "intutils" namespace.
}
Więc kiedy piszesz using namespace std
wszystko robisz mówi kompilatorowi, że w razie wątpliwości powinien wyglądać w przestrzeni nazw std
dla funkcji itp., dla których nie można znaleźć definicji. Jest to powszechnie stosowane w przykładowym (i produkcyjnym) kodzie, ponieważ sprawia, że pisanie popularnych funkcji itp., Takich jak cout
, jest szybsze niż konieczność pełnej kwalifikacji każdego z nich jako std::cout
.
Z technicznego punktu widzenia może być wymagane użycie przy użyciu (w przypadku całych przestrzeni nazw lub pojedynczych nazw), aby móc korzystać z wyszukiwania zależnego od argumentu.
Rozważ dwie następujące funkcje, które używają swap()
.
#include <iostream>
#include <algorithm>
namespace zzz
{
struct X {};
void swap(zzz::X&, zzz::X&)
{
std::cout << "Swapping X\n";
}
}
template <class T>
void dumb_swap(T& a, T& b)
{
std::cout << "dumb_swap\n";
std::swap(a, b);
}
template <class T>
void smart_swap(T& a, T& b)
{
std::cout << "smart_swap\n";
using std::swap;
swap(a, b);
}
int main()
{
zzz::X a, b;
dumb_swap(a, b);
smart_swap(a, b);
int i, j;
dumb_swap(i, j);
smart_swap(i, j);
}
dumb_swap
zawsze wywołuje std::swap
- choć wolelibyśmy użyciu zzz::swap
dla zzz::X
obiektów.
smart_swap
sprawia std::swap
widoczny jako wybór upadek do tyłu (na przykład, gdy nazywa się int), ale ponieważ nie w pełni kwalifikują się nazwę, zzz::swap
zostaną wykorzystane przez ADL dla zzz::X
.
subiektywnie, co zmusza mnie do korzystania using namespace std;
jest pisanie kodu, który wykorzystuje wszystkie rodzaje standardowych obiektów funkcyjnych itd
//copy numbers larger than 1 from stdin to stdout
remove_copy_if(
std::istream_iterator<int>(std::cin), std::istream_iterator<int>(),
std::ostream_iterator<int>(std::cout, "\n"),
std::bind2nd(std::less_equal<int>(), 0)
);
IMO, w kodzie tak std::
właśnie sprawia, że hałas linii.
Nie znajdę w takich przypadkach using namespace std;
haniebnej zbrodni, jeśli jest używana w pliku implementacji (ale może być nawet ograniczona do zakresu funkcji, jak w przykładzie zamiany).
Zdecydowanie nie umieszczaj instrukcji using w plikach nagłówkowych. Powodem tego jest to, że zanieczyszcza przestrzeń nazw dla innych nagłówków, które mogą być zawarte po naruszeniu, potencjalnie prowadząc do błędów w innych nagłówkach, które mogą nie być pod twoją kontrolą. (Dodaje również czynnik zaskoczenia: osoby, w tym plik, mogą nie oczekiwać widocznych nazw wszystkich rodzajów).
Nic, co musisz zrobić pod - chyba że jesteś implementatorem C++ Standard Library i chcesz unikaj powielania kodu podczas deklarowania plików nagłówków w stylu "nowym" i "starym":
// cstdio
namespace std
{
// ...
int printf(const char* ...);
// ...
}
.
// stdio.h
#include <cstdio>
using namespace std;
Cóż, oczywiście przykładem jest nieco wymyślony (można równie dobrze używać zwykłego <stdio.h>
i umieścić ją całą w std w <cstdio>
), ale Bjarne Stroustrup pokazuje ten przykład w jego .
- 1. Dlaczego readlinka gnu wymaga ode mnie dwukrotnego naciśnięcia klawisza C?
- 2. Kompilator LLVM 2.0: Ostrzeżenie za pomocą "using namespace std;"
- 3. C++ getline() nie wymaga deklaracji przestrzeni nazw
- 4. Dlaczego nie mogę umieścić deklaracji "using" w deklaracji klasy?
- 5. Wymuś ode mnie lokalnego mistrza/mistrza
- 6. Co wiodącą :: oznacza w "using namespace :: X" w C++
- 7. Dlaczego std :: this_thread namespace?
- 8. namespace std przeciążenia mniej niż
- 9. Dlaczego wszyscy używają niezatwierdzonych deklaracji przestrzeni nazw (np. Std :: not :: std: :)?
- 10. Czy std :: mt19937 wymaga rozgrzewania?
- 11. Using Struct Stat()
- 12. Co robi std :: _ lockit?
- 13. Co by "std :," zrobić w C++?
- 14. Co to jest pole @namespace w klasie C#?
- 15. Usuwanie std :: vector wymaga operatora przypisania. Czemu?
- 16. PHP namespace simplexml problems
- 17. forward declaration of namespace
- 18. JavaScript Namespace
- 19. Nieznany typ nazwa „namespace” XCode doładowania
- 20. Czy isnan w std :: namespace? Bardziej ogólnie, kiedy jest std :: konieczny, opcjonalny lub którego należy unikać?
- 21. TLS, co dokładnie oznacza dla mnie "rejectUnaauthorized"?
- 22. Co dokładnie robi słowo kluczowe "using" w języku C++?
- 23. Błąd Odd SciPy ODE Integracja
- 24. Co oznacza <: and :> przy deklaracji lambda?
- 25. std :: exception's co() zwraca "std :: wyjątek"
- 26. Numeryczne rozwiązywanie ODE w Pythonie
- 27. Błędy podczas rozwiązywania python ODE
- 28. Co powinienem zrobić: to wymaga android.permission.INTERACT_ACROSS_USERS_FULL
- 29. String to float using stringstream
- 30. Inicjowanie std :: shared_ptr <std::map<>> using usztywnione inicjalizacji
+1 Za to, że jest jedyną osobą, która wspomina, że jest zszokowana. – GManNickG