#4. [모던 C++] 개선된 네임스페이스(C++11, C++17, C++20)
- (C++11~) 인라인 네임스페이스가 추가되어 API 버전 구성이 편리해 졌습니다.
- (C++17~) 단순한 중첩 네임스페이스가 추가되어
::
로 표현할 수 있습니다.- (C++20~) 인라인 네임스페이스와 단순한 중첩 네임스페이스를 결합하여 표시할 수 있습니다.
인라인 네임스페이스
인라인 네임스페이스로 정의하면, 바깥쪽 네임스페이스에 암시적으로 using namespace
가 추가된 것처럼 동작합니다. 따라서, 바깥쪽 네임스페이스에서는 인라인 네임스페이스를 자신의 것처럼 사용할 수 있습니다.
이는 API 버전 처리에 효과적입니다. 각각의 버전을 네임스페이스로 분리하고, 사용하려는 버전에만 inline을 추가하면 됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
namespace MyLib {
namespace V1 {
int f() {return 1;} // #1
}
inline namespace V2_11 {
int f() {return 2;} // #2
}
}
EXPECT_TRUE(MyLib::V1::f() == 1);
EXPECT_TRUE(MyLib::V2_11::f() == 2);
EXPECT_TRUE(MyLib::f() == 2); // MyLib에 없으면 inline 사용
(C++17~) 단순한 중첩 네임스페이스
기존의 중첩 네임스페이스는 다음과 같이 정의했는데요(중첩 네임스페이스 참고),
1
2
3
4
5
6
7
8
9
10
11
namespace MyLib {
namespace Parser {
void Tokenizer() {}
}
namespace File {
void Load() {};
void Save() {};
}
}
MyLib::Parser::Tokenizer();
MyLib::File::Load();
C++17 부터는 ::
을 이용하여 단순하게 표현할 수 있습니다.
1
2
3
4
5
6
7
8
9
namespace MyLib_17::Parser {
void Tokenizer() {}
}
namespace MyLib_17::File {
void Load() {};
void Save() {};
}
MyLib_17::Parser::Tokenizer();
MyLib_17::File::Load();
(C++20~) 인라인 네임스페이스와 단순한 중첩 네임스페이스 결합
C++20부터는 인라인 네임스페이스와 단순한 중첩 네임스페이스를 결합하여 표시할 수 있습니다.
1
2
3
4
5
6
7
namespace A_20 {
namespace B_17 {
inline namespace C_11 {
void f() {}
}
}
}
은 다음과 같습니다.
1
2
3
namespace A_20::B_17::inline C_11 {
void f() {}
}
댓글남기기