Fark, karıştırılmış tanımlayıcının adıdır ( _ZN12_GLOBAL__N_11bE
vs _ZL1b
, gerçekten önemli değildir, ancak her ikisi de sembol tablosundaki yerel sembollere birleştirilir ( .global
asm yönergesinin yokluğu ).
#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
Yuvalanmış anonim bir ad alanına gelince:
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
Çeviri birimindeki tüm 1. düzey anonim ad alanları birbirleriyle birleştirilir, Çeviri birimindeki tüm 2. düzey iç içe anonim ad alanları birbirleriyle birleştirilir
Anonim bir ad alanında iç içe (satır içi) ad alanınız da olabilir
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
Ayrıca anonim satır içi ad alanlarına sahip olabilirsiniz, ancak anlayabildiğim kadarıyla inline
anonim bir ad alanında 0 etkisi vardır
inline namespace {
inline namespace {
int a = 3;
}
}
_ZL1b
: _Z
bunun karışık bir tanımlayıcı olduğu anlamına gelir. L
anlamına gelen yerel bir semboldür static
. 1
tanımlayıcının b
ve ardından tanımlayıcının uzunluğudurb
_ZN12_GLOBAL__N_11aE
_Z
bunun karıştırılmış bir tanımlayıcı olduğu anlamına gelir. N
Bu ad olduğu anlamına gelir 12
anonim ad adı uzunluğu _GLOBAL__N_1
, daha sonra anonim isim alanı _GLOBAL__N_1
, daha sonra 1
tanımlayıcının uzunluğu a
, a
tanımlayıcıdır a
ve E
tanımlayıcı kapanır bir isim alanı bulunur.
_ZN12_GLOBAL__N_11A1aE
içinde başka bir ad alanı düzeyi olması dışında yukarıdakiyle aynıdır 1A
static
bu bağlamda kullanımı tanımlanmamıştır ; Her ne kadar adı açıklanmayan ad için üstün bir alternatiftirstatic
, ordasın zaman başarısız nerede örneklerinistatic
kurtarmaya gelir .