La differenza è il nome dell'identificatore modificato ( _ZN12_GLOBAL__N_11bEvs _ZL1b, che non ha molta importanza, ma entrambi sono assemblati in simboli locali nella tabella dei simboli (assenza della .globaldirettiva asm).
#include<iostream>
namespace {
int a = 3;
}
static int b = 4;
int c = 5;
int main (){
std::cout << a << b << c;
}
.data
.align 4
.type _ZN12_GLOBAL__N_11aE, @object
.size _ZN12_GLOBAL__N_11aE, 4
_ZN12_GLOBAL__N_11aE:
.long 3
.align 4
.type _ZL1b, @object
.size _ZL1b, 4
_ZL1b:
.long 4
.globl c
.align 4
.type c, @object
.size c, 4
c:
.long 5
.text
Per quanto riguarda uno spazio dei nomi anonimo nidificato:
namespace {
namespace {
int a = 3;
}
}
.data
.align 4
.type _ZN12_GLOBAL__N_112_GLOBAL__N_11aE, @object
.size _ZN12_GLOBAL__N_112_GLOBAL__N_11aE, 4
_ZN12_GLOBAL__N_112_GLOBAL__N_11aE:
.long 3
.align 4
.type _ZL1b, @object
.size _ZL1b, 4
Tutti gli spazi dei nomi anonimi di 1 ° livello nell'unità di traduzione sono combinati tra loro, Tutti gli spazi dei nomi anonimi di 2 ° livello nell'unità di traduzione sono combinati tra loro
Puoi anche avere uno spazio dei nomi nidificato (in linea) in uno spazio dei nomi anonimo
namespace {
namespace A {
int a = 3;
}
}
.data
.align 4
.type _ZN12_GLOBAL__N_11A1aE, @object
.size _ZN12_GLOBAL__N_11A1aE, 4
_ZN12_GLOBAL__N_11A1aE:
.long 3
.align 4
.type _ZL1b, @object
.size _ZL1b, 4
which for the record demangles as:
.data
.align 4
.type (anonymous namespace)::A::a, @object
.size (anonymous namespace)::A::a, 4
(anonymous namespace)::A::a:
.long 3
.align 4
.type b, @object
.size b, 4
Puoi anche avere spazi dei nomi in linea anonimi, ma per quanto ne so, inlinesu uno spazio dei nomi anonimo ha effetto 0
inline namespace {
inline namespace {
int a = 3;
}
}
_ZL1b: _Zsignifica che si tratta di un identificatore alterato. Lsignifica che è un simbolo locale attraverso static. 1è la lunghezza dell'identificatore be quindi dell'identificatoreb
_ZN12_GLOBAL__N_11aE _Zsignifica che questo è un identificatore alterato. Nsignifica che questo è uno spazio dei nomi 12è la lunghezza del nome dello spazio dei nomi anonimo _GLOBAL__N_1, quindi il nome dello spazio dei nomi anonimo _GLOBAL__N_1, quindi 1è la lunghezza dell'identificatore a, aè l'identificatore ae Echiude l'identificatore che risiede in uno spazio dei nomi.
_ZN12_GLOBAL__N_11A1aE è uguale a quello precedente, tranne per il fatto che è presente un altro livello dello spazio dei nomi 1A
staticin questo contesto era indefinito ; sebbene lo spazio dei nomi senza nome sia un'alternativa superiore astatic, ci sono casi in cui fallisce quandostaticviene in soccorso .