Der Unterschied ist der Name des verstümmelten Bezeichners ( _ZN12_GLOBAL__N_11bE
vs _ZL1b
, was nicht wirklich wichtig ist, aber beide werden zu lokalen Symbolen in der Symboltabelle zusammengesetzt (Fehlen einer .global
asm-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 inline
ein anonymer Namespace den Effekt 0
inline namespace {
inline namespace {
int a = 3;
}
}
_ZL1b
: _Z
bedeutet, dass dies eine verstümmelte Kennung ist. L
bedeutet, es ist ein lokales Symbol durch static
. 1
ist die Länge des Bezeichners b
und dann des Bezeichnersb
_ZN12_GLOBAL__N_11aE
_Z
bedeutet, dass dies eine verstümmelte Kennung ist. N
Dies bedeutet, dass dies ein Namespace 12
ist. Dies ist die Länge des anonymen Namespace-Namens _GLOBAL__N_1
, dann der anonyme Namespace-Name _GLOBAL__N_1
, dann 1
die Länge des Bezeichners a
, a
der Bezeichner a
und E
schließ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
static
in diesem Zusammenhang nicht veraltet . Obwohl ein unbenannter Namespace eine überlegene Alternative zu darstelltstatic
, gibt es Fälle, in denen er beistatic
der Rettung fehlschlägt .