본문 바로가기
프로그래밍 언어/C++

[C++] Global Namespace (글로벌 네임스페이스)

by 까망 하르방 2024. 12. 19.
반응형

해당 포스팅에서는 global namespace에 대해

예시 코드를 포함하여 scope 개념을 더 알아보고자 함.

 

📌 [C++] 네임스페이스(namespace)

 

[C++] 네임스페이스(namespace) 활용

『 :: 』 기호는 Scope Operator로 "범위지정 연산자" 라고 한다.(네임스페이스 지정할 때 사용하는 연산자)#include namespace A{ void Print() { printf("a...\n"); }}namespace B{ void Print();}int main(){ A::Print(); B::Print();}

zoosso.tistory.com


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을 사용하는 경우

::print

① global namespace 검색 (없는 경우 Error)

 

print

① 열려있는 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
}
반응형

댓글