Sự khác biệt là tên của mã định danh được đọc sai ( _ZN12_GLOBAL__N_11bE
vs _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 .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
Đố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, inline
trên một không gian tên ẩn danh có 0 hiệu ứng
inline namespace {
inline namespace {
int a = 3;
}
}
_ZL1b
: _Z
có nghĩa đây là một định danh sai lệch. L
có nghĩa là nó là một biểu tượng địa phương thông qua static
. 1
là độ dài của mã định danh b
và sau đó là mã định danhb
_ZN12_GLOBAL__N_11aE
_Z
có nghĩa đây là một định danh sai lệch. N
có nghĩa đây là không gian tên 12
là độ 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 đó 1
là độ dài của mã định danh a
, a
là mã định danh a
và 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
static
trong 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 khistatic
giải cứu .