차이점은 맹 글링 된 식별자의 이름 ( _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
이 네임 스페이스는 수단 12
익명 공간 이름의 길이 _GLOBAL__N_1
, 그 익명 공간 이름 _GLOBAL__N_1
다음 1
식별자의 길이 a
, a
식별자 인 a
및 E
식별자를 폐쇄하는 공간에있다.
_ZN12_GLOBAL__N_11A1aE
다른 네임 스페이스 수준이 있다는 것을 제외하고는 위와 동일합니다. 1A
static
에서이 문맥에서 의 사용법은 사용되지 않았다 ; 하지만 익명의 네임 스페이스에 우수한 대안입니다static
, 거기 때 실패 할 경우 인스턴스를static
구출하러 온다 .