2009-08-13 1 views

risposta

15
namespace foo=bar; 

Ciò non influisce sulle regole di ricerca del nome. L'unico effetto è quello di rendere "pippo" un alias a "barra". per esempio:

namespace bar 
{ 
    void b(); 
} 

void f() { 
    bar::b(); // Call 'b' in bar 
    foo::b(); // 'foo' is an alias to 'bar' so calls same function 
} 

Quanto segue non cambiare le regole di ricerca

namespace NS 
{ 
    namespace bar 
    { 
    } 

    namespace foo { 
    using namespace bar; 

    void f() { 
     ++i; 
    } 
    } 
} 

Quando ricerca avviene per 'i', 'foo' verrà cercato per primo, poi 'NS' poi 'bar'.

+0

Ci scusiamo per il commento molto, molto tardi, ma ho pensato che altri potrebbero cercare. L'istruzione using bar namespace porta solo quelle cose definite in quel momento nello spazio dei nomi foo. In breve, può creare dipendenze di cattivo ordine. Vedere l'articolo n. 59 in Sutter/Alexandrescu per gli standard di codifica C++ –

+0

@RobL: Un utilizzo di _declaration_ riporta solo i nomi dichiarati in quel momento. Quanto sopra è un uso di _directive_. Il primo è come una ridichiarazione dei nomi dal namespace nello scope corrente. Quest'ultimo è più come una regola da cercare, dicendo, se non lo trovi qui, controlla questo altro spazio dei nomi. –

2

Come si importa uno spazio dei nomi in un altro, allora sì, dovrebbe essere uguale in tal senso. Tuttavia, il secondo consente anche di inserire altro codice all'interno, quindi puoi anche inserire elementi che sono non parte del namespace foo al suo interno. Il primo si limita a creare un alias.

+0

E se i nomi vengono aggiunti nello spazio dei nomi "pippo", le diverse regole di ricerca possono determinare la ricerca di nomi diversi tra i due esempi. –