2011-11-21 13 views
59

Esiste qualche differenza tra il wrapping del contenuto dell'intestazione e del file cpp in uno spazio dei nomi o solo il contenuto dell'intestazione e quindi lo utilizzando lo spazio dei nomi nel file cpp?Creazione di uno spazio dei nomi C++ nell'intestazione e nell'origine (cpp)

Per differenza intendo qualsiasi tipo di penalizzazione delle prestazioni o semantica leggermente diversa che può causare problemi o qualsiasi altra cosa di cui ho bisogno di essere a conoscenza.

Esempio:

// header 
namespace X 
{ 
    class Foo 
    { 
    public: 
    void TheFunc(); 
    }; 
} 

// cpp 
namespace X 
{ 
    void Foo::TheFunc() 
    { 
    return; 
    } 
} 

VS

// header 
namespace X 
{ 
    class Foo 
    { 
    public: 
    void TheFunc(); 
    }; 
} 

// cpp 
using namespace X; 
{ 
    void Foo::TheFunc() 
    { 
    return; 
    } 
} 

Se non v'è alcuna differenza ciò che è la forma preferita e perché?

risposta

28

Lo spazio dei nomi è solo un modo per manipolare la firma della funzione in modo che non entrino in conflitto. Alcuni preferiscono il primo e altri preferiscono la seconda versione. Entrambe le versioni non hanno alcun effetto sulle prestazioni del tempo di compilazione. Si noti che gli spazi dei nomi sono solo un'entità di tempo di compilazione.

L'unico problema che si verifica quando si utilizza lo spazio dei nomi è quando si hanno gli stessi nomi di spazi dei nomi nidificati (ad esempio) X::X::Foo. Ciò crea più confusione con o senza l'utilizzo di parole chiave.

34

La differenza tra "namespace X" e "using namespace X" è nella prima qualsiasi nuova dichiarazione sarà sotto lo spazio del nome mentre nella seconda non lo sarà.

Nell'esempio non ci sono nuove dichiarazioni, quindi nessuna differenza, quindi nessun modo preferito.

+0

Dipende dal progetto e dallo stile. Spesso c'è uno spazio dei nomi principale per un carico di file in un modulo, e il secondo stile ha senso. –

1

Se la seconda compila anche, non ci dovrebbero essere differenze. Gli spazi dei nomi vengono elaborati in fase di compilazione e non devono influire sulle azioni di runtime.

Ma per problemi di progettazione, il secondo è orribile. Anche se compila (non è sicuro), non ha alcun senso.

+1

Non penso che compili, ma non perché c'è una differenza, ma perché c'è un randagio '{' ;-) –

+0

La differenza è Foo :: TheFunc() è dichiarato nello spazio dei nomi globale, mentre è definito nello spazio dei nomi X. –

1

Foo :: TheFunc() non è nello spazio dei nomi corretto nel caso VS. Usa 'void X :: Foo :: TheFunc() {}' per implementare la funzione nello spazio dei nomi corretto (X).

+0

La domanda è un po 'vecchia, ma sai quali sono le conseguenze di questo? cioèti imbatterai in qualche problema con il modo in cui il suo caso VS dichiara le funzioni nel namespace, ma le definisce al di fuori di esso? –

5

Non ci sono penalizzazioni prestazionali, dal momento che il risultato potrebbe essere lo stesso, ma inserire lo Foo nello spazio dei nomi introduce implicitamente ambiguità nel caso in cui si disponga di Foo in spazi dei nomi diversi. È possibile ottenere il codice Fubar, infatti. Mi consiglia di evitare l'uso di using per questo scopo.

E si dispone di un randagio { dopo using namespace ;-)

+0

Non lo chiamerei randagio, dato che corrisponde alla chiusura '}' alla fine. Tuttavia, chiamerei quella coppia di parentesi ridondante;) – blubberdiblub

+0

@blubberdiblub, la domanda è stata modificata, se hai controllato la versione originale, * dovresti * chiamarla randagio ;-) –

0

Nel caso in cui se non avvolgere solo il contenuto .h dovete scrivere utilizzando namespace ... in un file cpp altrimenti ogni volta a lavorare sul valida namespace. Normalmente si avvolgono entrambi i file .cpp e .h altrimenti si rischia di utilizzare oggetti da un altro spazio dei nomi che potrebbe generare molti problemi.

Problemi correlati