이름이 없는 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;
}
프로그램에서 중요한 함수 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 V1의 foo()는 그 상위공간인 전역공간에서 정의된 것처럼 사용 가능
이렇게 신버젼인 V2를 사용하려면 V2::foo()로 호출해 사용하고, 기존 버젼의 프로그램과 호환되는 V1의 foo()는 inline덕분에 그냥 사용 가능
그리고 이제 완전히 신버젼 V2를 사용하려면 아래와 같이 inline을 V2로 옮기면 된다
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에 관여하지는 않는다
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()로 V2의 foo()를 호출가능하면서, foo()는 internal linkage를 가짐. inline이 linkage에 관여 안 하므로.