Разница заключается в названии искаженного идентификатора ( _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
приходит на помощь .