不同之处在于损坏标识符的名称(_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
翻译单元中的所有 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
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
//inline has the same output
您也可以使用匿名内联命名空间,但据我所知,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
)称为A
,前缀长度A
为1。匿名名称空间都有名称_GLOBAL__N_1