区别在于被破坏的标识符的名称(_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
翻译单元中所有第一级匿名命名空间相互组合,翻译单元中所有第二级嵌套匿名命名空间相互组合
还可以在匿名名称空间中拥有嵌套名称空间或嵌套内联名称空间
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
您还可以使用匿名的内联名称空间,但据我所知,匿名名称空间上的内联效果为0
inline namespace {
inline namespace {
int a = 3;
}
}
_ZL1b: _Z表示这是一个错误的标识符。L表示它是通过静态的局部符号。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