La differenza è il nome dell'identificatore modificato ( _ZN12_GLOBAL__N_11bE
vs _ZL1b
, che non ha molta importanza, ma entrambi sono assemblati in simboli locali nella tabella dei simboli (assenza della .global
direttiva 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, inline
su uno spazio dei nomi anonimo ha effetto 0
inline namespace {
inline namespace {
int a = 3;
}
}
_ZL1b
: _Z
significa che si tratta di un identificatore alterato. L
significa che è un simbolo locale attraverso static
. 1
è la lunghezza dell'identificatore b
e quindi dell'identificatoreb
_ZN12_GLOBAL__N_11aE
_Z
significa che questo è un identificatore alterato. N
significa 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 a
e E
chiude 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
static
in questo contesto era indefinito ; sebbene lo spazio dei nomi senza nome sia un'alternativa superiore astatic
, ci sono casi in cui fallisce quandostatic
viene in soccorso .