La diferencia es el nombre del identificador destrozado ( _ZN12_GLOBAL__N_11bE
vs _ZL1b
, que realmente no importa, pero ambos se ensamblan en símbolos locales en la tabla de símbolos (ausencia de .global
directiva 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
En cuanto a un espacio de nombres anónimo anidado:
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 los espacios de nombres anónimos de primer nivel en la unidad de traducción se combinan entre sí. Todos los espacios de nombres anónimos de segundo nivel en la unidad de traducción se combinan entre sí.
También puede tener un espacio de nombres anidado (en línea) en un espacio de nombres 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
También puede tener espacios de nombres en línea anónimos, pero por lo que puedo decir, inline
en un espacio de nombres anónimo tiene un efecto 0
inline namespace {
inline namespace {
int a = 3;
}
}
_ZL1b
: _Z
significa que este es un identificador destrozado. L
significa que es un símbolo local a través de static
. 1
es la longitud del identificador b
y luego el identificadorb
_ZN12_GLOBAL__N_11aE
_Z
significa que este es un identificador destrozado. N
significa que este es un espacio de nombres 12
es la longitud del nombre de espacio de nombres anónimo _GLOBAL__N_1
, luego el nombre de espacio de nombres anónimo _GLOBAL__N_1
, luego 1
es la longitud del identificador a
, a
es el identificador a
y E
cierra el identificador que reside en un espacio de nombres.
_ZN12_GLOBAL__N_11A1aE
es el mismo que el anterior, excepto que hay otro nivel de espacio de nombres en él 1A
static
en este contexto no estaba en desuso ; Aunque el espacio de nombres sin nombre es una alternativa superior astatic
, hay casos en los que falla cuando sestatic
trata del rescate .