Perbedaannya adalah nama pengidentifikasi hancur ( _ZN12_GLOBAL__N_11bE
vs _ZL1b
, yang tidak terlalu penting, tetapi keduanya dirakit menjadi simbol lokal dalam tabel simbol (tidak adanya .global
arahan 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
Adapun ruang nama anonim bersarang:
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
Semua ruang nama anonim tingkat 1 di unit terjemahan digabungkan satu sama lain, Semua ruang nama anonim bersarang tingkat 2 di unit terjemahan digabungkan satu sama lain
Anda juga dapat memiliki namespace bersarang (sebaris) di namespace anonim
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
Anda juga dapat memiliki ruang nama sebaris anonim, tetapi sejauh yang saya tahu, inline
pada ruang nama anonim memiliki 0 efek
inline namespace {
inline namespace {
int a = 3;
}
}
_ZL1b
: _Z
berarti ini adalah pengidentifikasi yang rusak. L
berarti itu adalah simbol lokal static
. 1
adalah panjang pengidentifikasi b
dan kemudian pengidentifikasib
_ZN12_GLOBAL__N_11aE
_Z
berarti ini adalah pengidentifikasi yang rusak. N
berarti ini adalah namespace 12
adalah panjang nama namespace anonim _GLOBAL__N_1
, maka nama namespace anonim _GLOBAL__N_1
, kemudian 1
panjang pengidentifikasi a
, a
adalah pengidentifikasi a
dan E
menutup pengidentifikasi yang berada di namespace.
_ZN12_GLOBAL__N_11A1aE
sama seperti di atas kecuali ada level namespace lain di dalamnya 1A
static
dalam konteks ini tidak dihargai ; meskipun namespace yang tidak disebutkan namanya adalah alternatif yang unggulstatic
, ada contoh di mana ia gagal ketikastatic
datang untuk menyelamatkan .