1 분 소요

인라인 네임스페이스

인라인 네임스페이스로 정의하면, 바깥쪽 네임스페이스에 암시적으로 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() {}
}

태그:

카테고리:

업데이트:

댓글남기기