違いは、マングルされた識別子の名前です(_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
、匿名の名前空間では効果がありません
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
救助に来ます。