2013-05-31 15 views
8

In C++, so che se dichiaro una funzione con statico, nomi esisterà solo per l'unità di compilazione in cui si dichiara/definito:Esiste qualche differenza tra la definizione della funzione statica nello spazio dei nomi anonimo e all'esterno?

static void MyFunction() {...} 

Inoltre, se dichiaro la mia funzione all'interno di un namespace anonimo , il suo nome esisterà solo in unità di compilazione locali:

namespace 
{ 
    void MyFunction() {...} 
} 

Inoltre, posso utilizzare statica all'interno del namespace anonimo:

namespace 
{ 
    static void MyFunction() {...} 
} 

C'è qualche differenza tra queste definizioni?

Grazie

+2

http://stackoverflow.com/questions/154469/unnamed-anonymous-namespaces-vs-static-functions – catscradle

+0

@catscradle quasi lo stesso, ma non discutere dell'uso statico all'interno dell'anonimo. – bcsanches

risposta

12

Sì, c'è una differenza.

In primo luogo, siamo precisi, fino al punto di essere pedanti: i nomi esistono ovunque. La distinzione è:

  • Se un simbolo viene dichiarata static (a perimetro namespace), ha collegamento interno, il che significa che lo stesso nome in un diverso gruppo di traslazione riferisce ad un'entità diversa.

  • Un namespace senza nome genera uno spazio dei nomi il cui nome è univoco per l'unità di traduzione. Il simbolo ha ancora il collegamento esterno (a condizione che non sia statico), ma non è possibile in alcun modo che lo si possa chiamare in un'altra unità di traduzione.

La differenza principale riguarda i modelli. Almeno fino a C++ 11 (e forse ancora, non ho controllato), qualsiasi entità utilizzata per creare un'istanza di deve avere un collegamento esterno. Quindi potresti non istanziare un modello su qualcosa dichiarato statico, o che implicitamente aveva il collegamento interno.

+1

Sì, C++ 11 ha cancellato la necessità di richiedere il collegamento esterno per i modelli. Il che è utile, dal momento che penso che il tipo di espressione lambda non abbia alcun collegamento. – aschepler

+0

@aschepler È utile anche senza lambda, ma ovviamente lambda apre una nuova prospettiva di possibilità. –

Problemi correlati