Der Unterschied ist der Name des verstümmelten Bezeichners ( _ZN12_GLOBAL__N_11bEvs _ZL1b, was nicht wirklich wichtig ist, aber beide werden zu lokalen Symbolen in der Symboltabelle zusammengesetzt (Fehlen einer .globalasm-Direktive).
#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
Wie für einen verschachtelten anonymen Namespace:
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
Alle anonymen Namespaces der ersten Ebene in der Übersetzungseinheit werden miteinander kombiniert. Alle verschachtelten anonymen Namespaces der zweiten Ebene in der Übersetzungseinheit werden miteinander kombiniert
Sie können auch einen verschachtelten (Inline-) Namespace in einem anonymen Namespace haben
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
Sie können auch anonyme Inline-Namespaces verwenden, aber soweit ich das beurteilen kann, hat inlineein anonymer Namespace den Effekt 0
inline namespace {
inline namespace {
int a = 3;
}
}
_ZL1b: _Zbedeutet, dass dies eine verstümmelte Kennung ist. Lbedeutet, es ist ein lokales Symbol durch static. 1ist die Länge des Bezeichners bund dann des Bezeichnersb
_ZN12_GLOBAL__N_11aE _Zbedeutet, dass dies eine verstümmelte Kennung ist. NDies bedeutet, dass dies ein Namespace 12ist. Dies ist die Länge des anonymen Namespace-Namens _GLOBAL__N_1, dann der anonyme Namespace-Name _GLOBAL__N_1, dann 1die Länge des Bezeichners a, ader Bezeichner aund Eschließt den Bezeichner, der sich in einem Namespace befindet.
_ZN12_GLOBAL__N_11A1aE ist das gleiche wie oben, außer dass es eine andere Namespace-Ebene gibt 1A
staticin diesem Zusammenhang nicht veraltet . Obwohl ein unbenannter Namespace eine überlegene Alternative zu darstelltstatic, gibt es Fälle, in denen er beistaticder Rettung fehlschlägt .