Różnica polega na nazwie zniekształconego identyfikatora ( _ZN12_GLOBAL__N_11bE
vs _ZL1b
, co tak naprawdę nie ma znaczenia, ale oba są połączone z symbolami lokalnymi w tabeli symboli (brak .global
dyrektywy 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
Jeśli chodzi o zagnieżdżoną anonimową przestrzeń nazw:
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
Wszystkie anonimowe przestrzenie nazw pierwszego poziomu w jednostce tłumaczeniowej są ze sobą łączone, Wszystkie zagnieżdżone anonimowe przestrzenie nazw pierwszego poziomu w jednostce tłumaczącej są ze sobą łączone
Możesz także mieć zagnieżdżoną (wbudowaną) przestrzeń nazw w anonimowej przestrzeni nazw
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
Możesz także mieć anonimowe wbudowane przestrzenie nazw, ale o ile wiem, inline
na anonimowej przestrzeni nazw ma 0 wpływ
inline namespace {
inline namespace {
int a = 3;
}
}
_ZL1b
: _Z
oznacza, że jest to zniekształcony identyfikator. L
oznacza, że jest to symbol lokalny przez static
. 1
jest długością identyfikatora, b
a następnie identyfikatoremb
_ZN12_GLOBAL__N_11aE
_Z
oznacza, że jest to zniekształcony identyfikator. N
oznacza, że to przestrzeń nazw 12
jest długością anonimowej nazwy przestrzeni nazw _GLOBAL__N_1
, następnie anonimowa nazwa przestrzeni nazw _GLOBAL__N_1
, a następnie 1
długość identyfikatora a
, a
jest identyfikatorem a
iE
zamyka identyfikator znajdujący się w przestrzeni nazw.
_ZN12_GLOBAL__N_11A1aE
jest taki sam jak powyżej, ale zawiera inny poziom przestrzeni nazw 1A
static
w tym kontekście było nieaktualne ; chociaż nienazwana przestrzeń nazw jest doskonałą alternatywą dlastatic
, istnieją przypadki, w których zawodzi, gdystatic
przychodzi na ratunek .