A diferença é o nome do identificador desconfigurado ( _ZN12_GLOBAL__N_11bE
vs _ZL1b
, o que realmente não importa, mas os dois são montados em símbolos locais na tabela de símbolos (ausência de .global
diretiva 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
Quanto a um espaço de nome anônimo aninhado:
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
Todos os namespaces anônimos de 1º nível na unidade de tradução são combinados entre si, Todos os namespaces anônimos anônimos de 2º nível na unidade de tradução são combinados entre si
Você também pode ter um espaço para nome aninhado (em linha) em um espaço para nome anônimo
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
Você também pode ter namespaces anônimos inline, mas até onde eu sei, inline
um namespace anônimo tem efeito 0
inline namespace {
inline namespace {
int a = 3;
}
}
_ZL1b
: _Z
significa que este é um identificador mutilado. L
significa que é um símbolo local através de static
. 1
é o comprimento do identificador b
e, em seguida, o identificadorb
_ZN12_GLOBAL__N_11aE
_Z
significa que este é um identificador mutilado. N
significa que este é um espaço para nome, 12
é o tamanho do nome do espaço para nome anônimo _GLOBAL__N_1
, o nome do espaço para nome anônimo _GLOBAL__N_1
, 1
o comprimento do identificador a
, a
o identificador a
eE
fecha o identificador que reside em um espaço para nome.
_ZN12_GLOBAL__N_11A1aE
é o mesmo que acima, exceto que há outro nível de espaço para nome nele 1A
static
desse contexto não foi preterido ; embora o espaço para nome sem nome seja uma alternativa superiorstatic
, há casos em que falha quando sestatic
trata de resgate .