2015-10-19 9 views
5

Stavo integrando un C++ in uno di somelse e ho scoperto che adottiamo due strategie diverse per l'uso di usando i comandi dello spazio dei nomi.C++ Posizione corretta per 'using namespace'

Per la pulizia del codice sorgente, quale delle due è la soluzione più corretta?

namespace foo 
{ 
    using namespace bar; 
} 

o

using namespace bar; 

namespace foo 
{ 
} 

Grazie mille per il vostro aiuto,

T.

risposta

7

I due non sono equivalenti. Nel primo caso lo spazio nomi bar viene importato nello spazio dei nomi foo, quindi per ogni bar::x è possibile accedervi come foo::x. In quest'ultimo lo spazio dei nomi bar viene importato nello spazio dei nomi globale (o nello spazio dei nomi che li avvolge entrambi) ed è accessibile come ::x.

Consiglierei di scegliere sempre la soluzione più stretta possibile per voi. Fino al punto di includere lo spazio dei nomi solo nella funzione in cui ne hai effettivamente bisogno. Quindi, se sei in dubbio, vai con il primo.

+1

+1 per "il più stretto possibile". Non scrivo quasi mai 'usando namespace' - è quasi sempre meglio usare solo i nomi specifici che vuoi dal namespace. –

+0

@TobySpeight Sicuro. Eccezioni a questo sono spazi dei nomi come 'std :: literals' o' std :: placeholders' che sono progettati per essere inclusi nella sua interezza. – Shoe

+0

@Jefffrey è d'accordo, anche se il boost è arrivato prima, anche std :: placeholder può essere un campo minato. std :: literals è l'unico sicuro. –

0

Questa domanda ha già una risposta, ma voglio reiterare il punto presentato da Toby Speight. Non si dovrebbe mai scrivere qualcosa come using namespace bar.

È buona pratica utilizzare using come ausilio di aliasing per long/hierarchial namespaces. Come

using po = boost::program_options; 

e quindi utilizzare

po.notify(vm); 

Uno di due alternative suggerite in questione sono solo un bene per le discussioni o interviste.

+0

"Non si dovrebbe mai scrivere qualcosa come' usando la barra dei nomi '". Non sono affatto d'accordo. Alcuni spazi dei nomi devono essere importati con 'using namespace'. Proprio come praticamente qualsiasi altro assoluto che puoi attaccare alla programmazione, ci sono sempre delle eccezioni. – Shoe

+0

Sto ripetendo il punto discusso in http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice – gjha

+0

La mia domanda non viene risolta in quella discussione. Mi stavo chiedendo la best practice tra i 2, non se uno di loro dovesse essere considerato uno cattivo – Tambo