違いは、マングルされた識別子の名前です(_ZN12_GLOBAL__N_11bEvs _ZL1b、これは重要ではありませんが、どちらもシンボルテーブルのローカルシンボルにアセンブルされます(.globalasmディレクティブがない場合))。
#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救助に来ます。