C ++에서 "네임 스페이스 별명"이란 무엇입니까?


156

C ++에서 "네임 스페이스 별명"이란 무엇입니까? 어떻게 사용 되나요?

답변:


186

네임 스페이스 별칭은 다른 짧은 이름으로 긴 네임 스페이스 이름을 참조하는 편리한 방법입니다.

예를 들어, using namespace지시문 없이 Boost의 uBLAS에서 숫자 벡터를 사용하려한다고 가정하십시오 . 매번 전체 네임 스페이스를 지정하는 것은 번거 롭습니다.

boost::numeric::ublas::vector<double> v;

대신, 당신은 별칭을 정의 할 수 있습니다 boost::numeric::ublas우리가 이것을 생략하고 싶은 말은 - ublas:

namespace ublas = boost::numeric::ublas;


ublas::vector<double> v;

7
downvotes를 설명하기 위해, SO는 좋은 C ++ 교과서를 대신 할 수 없으며 결코 대체되지 않을 것입니다. 당신이 제기 한 질문은 그러한 책에 의해 답변 될 것입니다. 또한 자신의 질문에 대답하는 SO "기능"을 그러한 책의 구절로 사용해서는 안됩니다.

24
범죄를 저 지르지 않았습니다 ... 내가 왜 그렇게했는지 설명하기 위해 : "엔트리 수준의"질문조차도 공정한 게임이라는 팟 캐스트의 Joel의 의견을 이해 한 것이 었습니다. 질문을하고 대답하는 것이 허용됩니다. 해당 콘텐츠가 아직 액세스 할 수없는 형태 인 경우 그러나 분명히 이것은 눈살을 찌푸리게합니까?
Martin B

1
자극을 피하기 위해 자신의 질문에 대답하는 데는 에티켓이 있습니다. 이 경우, 실제 질문 결코 없었습니다 . 예를 들면 다음과 같습니다. stackoverflow.com/questions/494927/…
Marc Gravell

6
@Martin B : 나는 이것이 엔트리 레벨 질문이라는 데 동의하지 않습니다. 사실 과거에 많은 투표를 통해 훨씬 더 분명한 질문이있었습니다. 사람들은 당신이 단순히 자신에 대한 명성을 얻으려고 노력하고 있다고 느낄 수도 있습니다. 이를 해결하는 방법은 질문 / 답 중 하나 또는 둘 다를 "커뮤니티 위키"로 표시하는 것입니다. 개인적으로 나는 당신으로서 질문을하고 공동체로서 대답 할 것입니다. 질문에 장점이 있으면 ROI를 얻게됩니다.
Richard Corden

1
중요한 질문은 그 질문이 실제적인 것인지의 여부라고 생각합니다. "-당신이 요청한 것입니까? 사람들이 알고 싶어하는 것입니까? 이미 아직 묻고 대답하지 않은 것입니까? 여기에 R 커뮤니티 게시 및 질문에 대한 SO 블로그 게시물이 있습니다. 커뮤니티에서 실제로 계속 질문 한 상위 X 개 질문을 선택 했기 때문에 실제 관련성이있었습니다. 언어 별 지식의 임의의 스 니펫을 가져와 여기에 게시하는 것 같습니다 덜 유용합니다.
jalf

7

간단히 말해 #define이 작동하지 않습니다.

namespace Mine { class MyClass { public: int i; }; }
namespace His = Mine;
namespace Yours { class Mine: public His::MyClass { void f() { i = 1; } }; }

잘 컴파일됩니다. 네임 스페이스 / 클래스 이름 충돌을 해결할 수 있습니다.

namespace Nope { class Oops { public: int j; }; }
#define Hmm Nope
namespace Drat { class Nope: public Hmm::Oops { void f () { j = 1; } }; }

마지막 줄에서 "Hmm : Oops"는 컴파일 오류입니다. 전처리 기는이를 Nope :: Oops로 변경하지만 Nope는 이미 클래스 이름입니다.


3
무슨 #define? 아마도 귀하의 답변은 이전 버전의 질문을 참조합니까?
einpoklum

3

이 주제에 대한 추가 정보 http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Core-C-/Stephan-T-Lavavej-Core-C-1-of-n

다음과 같이 빈 네임 스페이스 이름의 별칭을 선택하는 것입니다.

namespace SHORT = NamespaceFirst::NameSpaceNested::Meow

그런 다음 나중에 typedef를 입력 할 수 있습니다.

typedef SHORT::mytype

대신에

typedef NamespaceFirst::NameSpaceNested::Meow::mytype

이 구문은 네임 스페이스에 대해서만 작동하며 클래스 다음에 클래스, 유형을 포함 할 수 없습니다. namespace NAME =


3

또한 네임 스페이스 별명 및 지시문 사용은 런타임이 아닌 컴파일 타임에 해결됩니다. (더 구체적으로 말하면 현재 범위 또는 상위 범위에서 특정 기호를 찾을 수없는 경우 이름을 확인할 때 찾을 위치를 컴파일러에 알리는 데 사용되는 도구입니다.) 예를 들어, 두 가지 모두 엮다:

namespace A {
    int foo;
    namespace AA {
        int bar;
    } // namespace AA
    namespace AB {
        int bar;
    } // namespace AB
} // namespace A
namespace B {
    int foo;
    namespace BA {
        int bar;
    } // namespace BA
    namespace BB {
        int bar;
    } // namespace BB
} // namespace B

bool nsChooser1, nsChooser2;
// ...

// This doesn't work.
namespace C = (nsChooser1 ? A : B);
C::foo = 3;

// Neither does this.
// (Nor would it be advisable even if it does work, as compound if-else blocks without braces are easy to inadvertently break.)
if (nsChooser1)
    if (nsChooser2)
        using namespace A::AA;
    else
        using namespace A::AB;
else
    if (nsChooser2)
        using namespace B::BA;
    else
        using namespace B::BB;

이제 궁금한 점 constexpr은 컴파일 타임에 변수도 사용되며 별칭 또는 지시문과 함께 사용할 수 있는지 궁금합니다. 내가 아는 한, 나는 이것에 대해 틀릴 수 있지만. 서로 다른 네임 스페이스에서 동일한 이름을 가진 변수로 작업하고 동적으로 선택해야하는 경우 참조 또는 포인터를 사용해야합니다.

// Using the above namespaces...
int& foo = (nsChooser1 ? A::foo : B::foo);

int* bar;
if (nsChooser1) {
    if (nsChooser2) {
        bar = &A::AA::bar;
    } else {
        bar = &A::AB::bar;
    }
} else {
    if (nsChooser2) {
        bar = &B::BA::bar;
    } else {
        bar = &B::BB::bar;
    }
}

위의 유용성은 제한 될 수 있지만 목적에 부합해야합니다.

(위에서 놓친 오타에 대한 사과드립니다.)


0

네임 스페이스는 이름 충돌을 방지하는 데 사용됩니다.

예를 들면 다음과 같습니다.

namespace foo {
    class bar {
        //define it
    };
}

namespace baz {
    class bar {
        // define it
    };
}

이제 네임 스페이스 덕분에 완전히 다른 별도의 두 개의 클래스 이름 표시 줄이 생겼습니다.

"사용 네임 스페이스"는 네임 스페이스 내에서 클래스를 사용하기 위해 네임 스페이스를 지정할 필요가 없도록하기위한 것입니다. 즉 std :: string은 문자열이됩니다.

내 리소스 : https://www.quora.com/What-is-namespace-in-C++-1

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.