ความแตกต่างคือชื่อของตัวระบุที่ mangled ( _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
ในเนมสเปซที่ไม่ระบุตัวตนมีผล 0
inline namespace {
inline namespace {
int a = 3;
}
}
_ZL1b
: _Z
หมายความว่านี่เป็นตัวระบุที่ถูกบันทึกไว้ หมายความว่ามันเป็นสัญลักษณ์ท้องถิ่นผ่านL
คือความยาวของตัวระบุและตัวระบุstatic
1
b
b
_ZN12_GLOBAL__N_11aE
_Z
หมายความว่านี่เป็นตัวบ่งชี้ที่ยุ่งเหยิง N
หมายถึงนี้เป็น namespace 12
คือความยาวของชื่อ namespace ที่ไม่ระบุชื่อ_GLOBAL__N_1
แล้วชื่อ namespace ที่ไม่ระบุชื่อ_GLOBAL__N_1
แล้ว1
คือความยาวของตัวระบุที่a
, a
เป็นตัวบ่งชี้a
และE
ปิดตัวระบุที่อยู่ในใน namespace
_ZN12_GLOBAL__N_11A1aE
เหมือนกับด้านบนยกเว้นมีเนมสเปซอีกระดับหนึ่งอยู่ 1A
static
ในบริบทนี้ถูกundeprecated ; แม้จะไม่มีชื่อ namespace เป็นทางเลือกที่ดีกว่าstatic
ที่มีอยู่กรณีที่มันล้มเหลวเมื่อstatic
มาเพื่อช่วยเหลือ