2010-10-28 13 views
17

Eventuali duplicati:
Why is 'using namespace std;' considered a bad practice in C++?sta usando namespace..come male?

ogni volta che uso using namespace std ottengo sempre che "questo è un terribile abitudine di programmazione". Ora mi sto diplomando a dicembre con la mia B.S. in C.S. ma non pretendo di sapere tutto, ma nessuno ha mai spiegato perché questo è così male. Capisco cosa fa, ma onestamente non vedo un grosso problema.

Qualcuno si preoccupa di spiegare? Nella mia mente rende semplicemente la digitazione cout molto più sopportabile di std::cout.

Posso capire perché non si vorrebbe metterlo in un file di intestazione, ma solo in un file di implementazione normale ... Non vedo perché sarebbe un problema.

+1

'using namespace std' è un errore di sintassi in' C'. Ma 'using',' namespace' e 'std' da soli sono identificatori perfettamente legali (anche se odiosi) che è possibile utilizzare nel codice. – pmg

+1

@ pmg Nessuno ha mai parlato di C? – meagar

+10

Usare "mi piace" in una frase del genere è male ... –

risposta

14

trovato questo post utile altrove:

spazi dei nomi separati e organizzano la funzionalità. È possibile avere una funzione xander333::sort() e non sarà in conflitto con std::sort() o boost::sort() o qualsiasi altro ordinamento(). Senza spazi dei nomi può esserci solo uno sort().

Ora diciamo che hai messo "using namespace std;" in tutti i tuoi file sorgente e hai implementato una semplice funzione basata su modelli chiamata fill() nello spazio dei nomi globale di uno dei tuoi file. Questo file dipende anche da un'intestazione di libFoo - foo.hpp. La versione 2.1 di libFoo viene fuori e all'improvviso il tuo programma non compila più. La tua versione di fill() entra improvvisamente in conflitto con un'altra fill()! Quello che è successo?

Si scopre che le persone che implementano libFoo sono incluse nella nuova versione di foo.hpp quando non lo facevano prima. Ora hai tutti gli algoritmi standard inclusi nel tuo file sorgente e il tuo using namespace std; li ha portati tutti nello spazio dei nomi globale. std::fill() ora entra direttamente in conflitto con il tuo fill().

Più insidioso, il codice è stato compilato rinominando lo fill() in xander333_fill(), ma qualcosa non funziona correttamente - i numeri dei report sono disattivati. Si scopre che la funzione personalizzata divides(), che esegue la matematica di precisione fissa, non viene più chiamata perché la funzione basata su modello (anch'essa inclusa di nuovo da foo.hpp) consente una corrispondenza migliore perché i tipi di chiamata non corrispondono esattamente ai tipi dichiarati .

Discussione con la discussione rilevante è qui:

http://www.cplusplus.com/forum/unices/27805/

+3

O per dichiarare più semplicemente, è facile ottenere collisioni di nomi in futuro e possono essere insidiosi per correggere dopo il fatto. – Inverse

2

La mia preferenza è quella di:

  1. mai mettere una direttiva using in un file di intestazione (le cose che includono l'intestazione potrebbe non piace il fatto che li costretti ad avere la direttiva using).

  2. fanno sempre cose come l'uso di std :: cout; nella parte superiore dei file di implementazione, quindi non devo fare std :: cout ovunque nel mio codice.

+2

controllo terminologico: using namespace std; e simili sono chiamati usando le direttive (non usando le dichiarazioni). usando std :: cout ecc. si chiamano usando le dichiarazioni.:) –

+0

Sono passato molto tempo da quando ho fatto C++ - thx lo aggiusterò :-) – TofuBeer

3

una "buona pratica" di essere a conoscenza di è di non mettere in using namespace includere i file, ma essere liberi di usarlo a vostro gusto nei file cpp private. Conosco persone a cui piace che tutto sia pienamente qualificato e alcuni (come me) che presumono chesia un std::string salvo diversa indicazione.

Il motivo è che se/quando altri usano il file include (e questo accade sempre), sono costretti ad accettare il tuo stile di programmazione.

Buona fortuna!

23

Non c'è nessun problema con using namespace std nel file sorgente quando si fanno uso pesante del STL e sa per certo che nulla si scontrerà.

Tuttavia, molto spesso non è necessario utilizzare using namespace std o meno in tutto il file:

lo sapevate che è possibile:

void somefunction() 
{ 
    // Use it in a particular scope 
    using namespace std; 

    cout << "test" << endl; 
} 
+2

Avvertenza: non lo puoi sapere con certezza. (A meno che tu non cambi mai versioni di compilatori/librerie) – sehe

1

E 'principalmente di buona gestione. Se non utilizzerai più di qualche identificatore in uno spazio dei nomi, perché ingombrare il tuo spazio dei nomi scaricando tutti gli identificatori da quel namespace nel tuo? È preferibile utilizzare using std::cout. Tuttavia, se usi uno spazio dei nomi molto pesantemente e non causa alcuna collisione, vai avanti e usa using namespace.

0

Evitare l'uso di istruzioni per interi spazi dei nomi consente di evitare conflitti non intenzionali tra le librerie. Supposto che tu abbia creato la tua classe che aveva lo stesso nome di qualcosa in std, quindi a meno che tu non usi esplicitamente lo std:: avrai conflitti di nome.

Probabilmente è meglio cercare di evitare conflitti come questo in primo luogo, ma se si specifica lo spazio dei nomi per ciascun membro nel codice sarà meno ambiguo.

Se ci si stanca di digitare std :: cout in ogni momento, è possibile utilizzare un'istruzione using solo per quel membro.

1

Un altro motivo per non utilizzare using oltre a evitare potenziali conflitti di denominazione è accelerare l'IDE ed eventualmente compilarlo.

Se si utilizza Visual Studio, using namespace std e/o using namespace boost può uccidere completamente intellisense. Ci sono molti simboli in questi spazi dei nomi che potresti non realizzare e scaricarli nello spazio dei nomi globale può essere ridicolo.

Problemi correlati