ความแตกต่างคือชื่อของตัวระบุที่ mangled ( _ZN12_GLOBAL__N_11bEvs _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 คือความยาวของตัวระบุและตัวระบุstatic1bb
_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มาเพื่อช่วยเหลือ