2009-12-05 10 views
6

In un file .cpp, c'è qualche differenza/preferenza in entrambi i casi?Typedef namespace anonimo interno/esterno?

// file scope outside any namespace 
using X::SomeClass; 
typedef SomeClass::Buffer MyBuf; 

v/s

namespace { // anonymous 
    using X::SomeClass; 
    typedef SomeClass::Buffer MyBuf; 
} 

risposta

5

Non c'è molto senso porre typedef nel namespace anonimi. L'uso principale per gli spazi dei nomi anonimi è quello di evitare la collisione dei simboli tra le unità di traduzione posizionando le definizioni con un collegamento esterno.

+0

Hmm Ho pensato che lo spazio dei nomi anonimo avesse scope sull'intero contenuto del file, inclusi altri spazi dei nomi nel file, il che renderebbe lo stesso identico a mettere le cose in scope del file comunque (eccetto per le regole del linkage esterno). Non ero sicuro che le regole del linkage esterno sarebbero rilevanti per lo zucchero sintattico come typedef e l'uso. – Jay

+0

Hai ragione, posizionando la dichiarazione using nello spazio dei nomi anonimo o no non cambia nulla. Mi sono sbagliato. Ho modificato questo. – Thomas

7

Direi che il secondo utilizzo è piuttosto raro, almeno nel codice che ho visto finora (e ho visto molto C++ di codice). Potresti spiegare qual è il ragionamento alla base della seconda tecnica?

Generalmente si utilizza uno spazio dei nomi anonimo in un file di implementazione C++ per ottenere la stessa cosa che farebbe "statico" in C (o C++, ma lo sorveglieremo), vale a dire limitare la visibilità dei simboli a l'attuale unità di traduzione. Il typedef in realtà non produce simboli che vengono esportati per il linker in modo che non creino nulla di "concreto" nel senso di qualsiasi cosa concreta a cui si possa creare un collegamento.

La mia raccomandazione? Vorrei andare con la prima notazione. Il secondo aggiunge una complicazione inutile e, secondo me, non ti compra nulla.

+0

Parlare di quello usando lo spazio dei nomi {} invece di statico mi sembra un trucco, e non mi è mai piaciuto o l'ho usato. Se erano preoccupati per i 9 milioni di usi diversi dello statico, avrebbero dovuto introdurre una nuova parola chiave. –

+2

Stranamente, preferisco lo spazio dei nomi anonimo invece di statico, anche se ho fatto la mia giusta parte della programmazione in C. Sono esattamente i 9 milioni di usi e il conteggio delle statiche che mi fanno usare namespace anonimi. Inoltre, lo trovo un po 'più conciso ed è più difficile sbagliare rispetto al dimenticare di prefisso qualcosa con' statico '. –

+0

Avevo un sacco di cose di debug nello spazio dei nomi anonimo che ora non c'è più. L'unica cosa utile rimasta sono i typedefs e l'uso, quindi stavo discutendo se spostarli sull'ambito del file e spazzare lo spazio dei nomi anonimo. – Jay