Різниця полягає у назві розробленого ідентифікатора ( _ZN12_GLOBAL__N_11bE
vs _ZL1b
, що насправді не має значення, але вони обидва зібрані до локальних символів у таблиці символів (відсутність .global
директиви 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
Щодо вкладеного простору анонімних імен:
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
Усі анонімні простори імен 1-го рівня в блоці перекладу поєднуються один з одним. Усі вкладені анонімні простори імен 2-го рівня в блоці перекладу поєднуються між собою
Ви також можете мати вкладений (вбудований) простір імен в анонімному просторі імен
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
Ви також можете мати анонімні вбудовані простори імен, але, наскільки я можу сказати, inline
на анонімному просторі імен є 0 ефект
inline namespace {
inline namespace {
int a = 3;
}
}
_ZL1b
: _Z
означає, що це ідентичний ідентифікатор. L
означає, що це локальний символ наскрізь static
. 1
- довжина ідентифікатора, b
а потім ідентифікаторb
_ZN12_GLOBAL__N_11aE
_Z
означає, що це ідентичний ідентифікатор. N
означає, що це простір імен 12
- це довжина анонімного імені простору імен _GLOBAL__N_1
, потім анонімне ім’я простори імен _GLOBAL__N_1
, потім 1
- довжина ідентифікатора a
, a
є ідентифікатором a
іE
закриває ідентифікатор, який знаходиться в просторі імен.
_ZN12_GLOBAL__N_11A1aE
те саме, що вище, за винятком іншого рівня простору імен 1A
static
в цьому контексті було недооціненим ; хоча неназваний простір імен є чудовою альтернативоюstatic
, є випадки, коли він не працює, колиstatic
на допомогу .