Різниця полягає у назві розробленого ідентифікатора ( _ZN12_GLOBAL__N_11bEvs _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на допомогу .