La diferencia es el nombre del identificador destrozado ( _ZN12_GLOBAL__N_11bEvs _ZL1b, que realmente no importa, pero ambos se ensamblan en símbolos locales en la tabla de símbolos (ausencia de .globaldirectiva 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, inlineen un espacio de nombres anónimo tiene un efecto 0
inline namespace {
inline namespace {
int a = 3;
}
}
_ZL1b: _Zsignifica que este es un identificador destrozado. Lsignifica que es un símbolo local a través de static. 1es la longitud del identificador by luego el identificadorb
_ZN12_GLOBAL__N_11aE _Zsignifica que este es un identificador destrozado. Nsignifica que este es un espacio de nombres 12es 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 1es la longitud del identificador a, aes el identificador ay Ecierra 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
staticen 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 sestatictrata del rescate .