Sự khác biệt là tên của mã định danh được đọc sai ( _ZN12_GLOBAL__N_11bEvs _ZL1b, điều này không thực sự quan trọng, nhưng cả hai đều được lắp ráp thành các ký hiệu cục bộ trong bảng ký hiệu (không có lệnh .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
Đối với một không gian tên ẩn danh lồng nhau:
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
Tất cả các không gian tên ẩn danh cấp 1 trong đơn vị dịch được kết hợp với nhau, Tất cả các không gian tên ẩn danh cấp 2 lồng nhau trong đơn vị dịch được kết hợp với nhau
Bạn cũng có thể có một không gian tên lồng nhau (nội tuyến) trong một không gian tên ẩn danh
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
Bạn cũng có thể có các không gian tên nội tuyến ẩn danh, nhưng theo như tôi có thể nói, inlinetrên một không gian tên ẩn danh có 0 hiệu ứng
inline namespace {
inline namespace {
int a = 3;
}
}
_ZL1b: _Zcó nghĩa đây là một định danh sai lệch. Lcó nghĩa là nó là một biểu tượng địa phương thông qua static. 1là độ dài của mã định danh bvà sau đó là mã định danhb
_ZN12_GLOBAL__N_11aE _Zcó nghĩa đây là một định danh sai lệch. Ncó nghĩa đây là không gian tên 12là độ dài của tên không gian tên ẩn danh _GLOBAL__N_1, sau đó là tên không gian tên ẩn danh _GLOBAL__N_1, sau đó 1là độ dài của mã định danh a, alà mã định danh avà Eđóng định danh nằm trong không gian tên.
_ZN12_GLOBAL__N_11A1aE giống như trên, ngoại trừ có một mức không gian tên khác trong đó 1A
statictrong bối cảnh này không được đánh giá cao ; mặc dù không gian tên không tên là một thay thế vượt trộistatic, nhưng có những trường hợp nó bị lỗi khistaticgiải cứu .