2010-07-29 18 views
23

Qual è il diverso tra questi due?namespace anonimo

cpp-file:

namespace 
{ 
    int var; 
} 

o

int var; 

se entrambi sono messi nel file cpp? Non è corretto che abbiamo inserito una variabile nello spazio dei nomi anonimo in modo che possa essere privata solo per quel file? Ma se mettiamo una variabile globale in un file cpp non è anche quella variabile privat perché non fai mai un inclusione nel file .cpp?

risposta

29

Nel secondo caso, quando non si utilizza uno spazio dei nomi anonimo, se un altro file cpp dichiara uno extern int var;, sarà in grado di utilizzare la variabile.

Se si utilizza uno spazio dei nomi anonimo, al momento del collegamento, l'altro file cpp genererà un errore di riferimento non definito.

+2

Quindi penso che si possa ottenere lo stesso risultato impostando la variabile come statica. – Dacav

+0

Vero.Anche in C++ definendolo come const, che implica staticità. –

+1

@Dacav: vero. ma il modo C++ di farlo è usare uno spazio dei nomi anonimo. L'uso di static è solo il risultato del fatto che C++ è compatibile con le versioni precedenti di C. –

3

La seconda versione è definita nel namespace globale - altri file cpp possono arrivare ad essa dichiarando

extern int var;

e anche se non lo fanno, se qualcun altro usa lo stesso nome nello spazio dei nomi globale, si otterrà un errore di collegamento (simbolo definito più volte).

4

Nel secondo caso altri file .cpp può accedere la variabile come:

extern int var; 
var = 42; 

e il linker troverà. Nel primo caso il nome della variabile viene alterato oltre ogni ragione :) quindi quanto sopra non è possibile.

2

Oltre al motivo fornito da Nikolai e altri, se non si utilizza uno spazio dei nomi anonimo, è possibile ottenere conflitti di denominazione con altri dati globali. Se si utilizza uno spazio dei nomi anonimo, si ombreggerà invece i dati globali.

Da cprogramming.com: "All'interno dello spazio dei nomi si ha la certezza che nessun nome globale sarà in conflitto perché i nomi delle funzioni di ogni spazio dei nomi hanno la precedenza sui nomi di funzioni esterne."

1

due punti:

  1. chiunque utilizzi extern int var; può accedere la variabile se non è in uno spazio dei nomi senza nome.
  2. se in un altro file, si dispone di un'altra variabile globale int var, si avranno più definizioni di questa variabile.

Come definito nella norma:

[...] tutte le occorrenze di unico in un'unità traduzione sono sostituiti dai stesso identificatore e questo identificativo differisce da tutti gli altri identificatori in l'intero programma.