해당 포스팅에서는 global namespace에 대해
예시 코드를 포함하여 scope 개념을 더 알아보고자 함.
using 사용하면 :: 없이 간결하게 사용할 수 있지만
프로젝트 규모가 커지다보면 using 사용마저 충돌될 수 있다.
그래서 코드가 길어지더라도
완전한 이름 (qualified name) 사용하는 것이 좋을 수 있다.
#include <iostream>
namespace A
{
void print()
{
printf("a...\n");
}
}
namespace B
{
void print()
{
printf("b...\n");
}
}
int main()
{
using A::print;
print(); // ok
using B::print;
print(); // Error
A::print(); // <-- 권장
B::print(); // <-- 권장
}
Global namespace = 특정한 이름공간에 포함되지 않은 공간
print를 Global namespace에도 추가하였다.
#include <iostream>
namespace A
{
void print()
{
printf("a...\n");
}
}
void print() { printf("global... \n"); }
int main()
{
::print(); // global
print(); // global
}
main 함수안에 using 추가하였는데
::print는 계속해서 global
print()는 namespace A
#include <iostream>
namespace A
{
void print()
{
printf("a...\n");
}
}
void print() { printf("global... \n"); }
int main()
{
using A::print;
::print(); // global
print(); // a
}
특정 함수 안에 using을 사용하는 경우
① global namespace 검색 (없는 경우 Error)
① 열려있는 namespace 검색
② global namespace 검색
함수 밖에서 using declaration 하는 경우
① using 선언 아래 있는 모든 함수에서 namespace 명시 없이 접근 가능
② global namespace에 동일 이름 함수가 있으면 Compile Error
→ global namespace에 동일 이름 함수가 없으면 해당 using namespace 사용
global 영역에서 using을 선언하였다.
결과적으로 global 영역에 2개의 print가 있게 된다.
그렇기에 Compile Error 발생
[예시]
global namespace에 동일 함수가 존재하는 경우
#include <iostream>
namespace A
{
void print()
{
printf("a...\n");
}
}
void print() { printf("global... \n"); }
using A::print;
int main()
{
::print(); // error
print(); // error
}
[예시]
global namespace에서 using 사용 (동일 함수 존재 X)
#include <iostream>
namespace A
{
void print()
{
printf("a...\n");
}
}
using A::print;
int main()
{
::print(); // a
print(); // a
}
'프로그래밍 언어 > C++' 카테고리의 다른 글
[C++] 헤더 변화 및 특징 (3) | 2024.12.27 |
---|---|
[C/C++] Volatile 키워드 (2) | 2024.12.23 |
[C++] 네임스페이스(namespace) 활용 (0) | 2024.12.18 |
[임베디드/펌웨어] Bitmap Based 연산 예시 (5) | 2024.12.01 |
[C/C++] packed 키워드 (3) | 2024.11.16 |
댓글