Unnamed/ inline namespaces

김펭귄·2025년 7월 26일

C++

목록 보기
12/20

Unnamed namespaces

  • 이름이 없는 namespace

  • 이 namespace에서 정의된 것들은 해당 namespace의 상위공간에서 정의된 것으로 간주됨

  • 대신, internal linkage를 가져 다른 파일에서는 접근 못 함

  • 다른 파일에는 공유하고 싶지 않을 때 사용 가능

namespace 				// 이름이 없음
{
    void foo() 			// 이 파일에서만 사용 가능
    {
        std::cout << 5;
    }
}

// void foo() { std:: cout << 5;}  이렇게 바깥으로 끄집어 냈다고 생각하면 보기 편함

namespace A 
{
	namespace 	
    {
    	int x {5};	// 이 파일에서만 사용 가능
    }
}

// namespace A { int x; } 와 동일. 대신 다른 파일과는 namespace A의 x를  공유 안 함

int main()
{
    foo(); 				// namespace 이름 없이 호출 가능
	std::cout << A::x;	

    return 0;
}

inline namespaces

  • 프로그램에서 중요한 함수 foo()가 있을 때, 업데이트하는 과정에서 이 함수를 고쳐야 할 상황이 생겼다 가정해보자

  • 이 함수를 업데이트하였을 때, 이전 버젼의 프로그램에서는 문제가 생길 수도 있다

  • 이때, 다른 이름의 새로운 함수(foo_v2, foo_v3...)들을 새로 만들면 되지만, 시간이 지날 수록 다양한 버젼의 함수들이 존재하게 됨

  • 이때, inline namespace를 사용하여 이 문제를 해결할 수 있다

inline namespace V1 		// V1을 inline으로 설정
{
    void foo() { std::cout << "V1\n"; }
}

namespace V2 				// V2는 일반적으로 선언
{
    void foo() { std::cout << "V2\n"; }
}

int main()
{
    V1::foo(); 				// V1의 foo 호출
    V2::foo(); 				// V2의 foo 호출

    foo(); 					// V1의 foo 호출
}
  • inline namespace를 사용하면 unnamed namespace처럼 해당 공간의 상위 공간에서 정의된 것으로 간주

  • 따라서 inline namespace V1foo()는 그 상위공간인 전역공간에서 정의된 것처럼 사용 가능

  • 이렇게 신버젼인 V2를 사용하려면 V2::foo()로 호출해 사용하고, 기존 버젼의 프로그램과 호환되는 V1foo()inline덕분에 그냥 사용 가능

  • 그리고 이제 완전히 신버젼 V2를 사용하려면 아래와 같이 inlineV2로 옮기면 된다

namespace V1 		// V1을 그냥
{
	...
}

inline namespace V2 // V2를 inline으로
{
	...
}

int main()
{
    V1::foo(); 			// V1의 foo 호출
    V2::foo(); 			// V2의 foo 호출

    foo(); 				// V2의 foo 호출 (신버젼)
}
  • 이렇듯 inline namespace는 버젼 관리하는데에 자주 사용된다

  • unnamed namespace와는 달리 linkage에 관여하지는 않는다

unnamed / inline 혼합

inline namespace V2 // declare an inline namespace named V2
{
    namespace 		// unnamed namespace (internal linkage)
    {
        void foo() 
        {
            std::cout << "V2\n";
        }

    }
}

int main() {
	foo();		// V2의 foo를 호출
}
  • foo()V2foo()를 호출가능하면서, foo()는 internal linkage를 가짐. inline이 linkage에 관여 안 하므로.

Reference

learncpp.com

profile
반갑습니다

0개의 댓글