헤더 및 소스 (CPP)에 C ++ 네임 스페이스 만들기 네임 스페이스

헤더와 cpp 파일 내용을 네임 스페이스에 래핑하거나 헤더 콘텐츠 만 래핑 한 다음 cpp 파일에서 네임 스페이스사용 하는 것 사이에 차이가 있습니까?

차이점은 문제를 일으킬 수있는 정렬 성능 저하 또는 약간 다른 의미 체계를 의미합니다.

예:

// header
namespace X
{
  class Foo
  {
  public:
    void TheFunc();
  };
}

// cpp
namespace X
{
  void Foo::TheFunc()
  {
    return;
  }
}

VS

// header
namespace X
{
  class Foo
  {
  public:
    void TheFunc();
  };
}

// cpp
using namespace X;
{
  void Foo::TheFunc()
  {
    return;
  }
}

차이가없는 경우 선호하는 형식은 무엇이며 그 이유는 무엇입니까?



답변

네임 스페이스는 충돌하지 않도록 함수 서명을 조작하는 방법 일뿐입니다. 일부는 첫 번째 방법을 선호하고 다른 일부는 두 번째 버전을 선호합니다. 두 버전 모두 컴파일 시간 성능에 영향을주지 않습니다. 네임 스페이스는 단지 컴파일 시간 엔터티입니다.

네임 스페이스를 사용할 때 발생하는 유일한 문제는 동일한 중첩 네임 스페이스 이름이있는 경우입니다 (예 🙂 X::X::Foo. 그렇게하면 키워드를 사용하거나 사용하지 않고 더 많은 혼란을 야기합니다.


답변

“네임 스페이스 X”와 “네임 스페이스 X 사용”의 차이점은 첫 번째 선언에서 새로운 선언이 네임 스페이스 아래에있는 반면 두 번째 선언에서는 그렇지 않습니다.

귀하의 예에는 새로운 선언이 없으므로 차이가 없으므로 선호하는 방법이 없습니다.


답변

결과가 동일 할 수 있기 때문에 성능상의 불이익은 없지만 Foo네임 스페이스에을 넣는 Foo것은 다른 네임 스페이스에 s 가있는 경우 암시 적으로 모호함을 유발 합니다. 실제로 코드 푸바를 얻을 수 있습니다. using이 목적으로 사용하지 않는 것이 좋습니다 .

그리고 당신은 😉 {후에 길 을 using namespace잃었습니다.


답변

두 번째 파일도 컴파일되면 차이가 없어야합니다. 네임 스페이스는 컴파일 타임에 처리되며 런타임 작업에 영향을주지 않습니다.

그러나 디자인 문제의 경우 두 번째는 끔찍합니다. 컴파일하더라도 (확실하지 않음) 전혀 의미가 없습니다.


답변

Foo :: TheFunc ()가 VS 케이스의 올바른 네임 스페이스에 없습니다. 올바른 네임 스페이스 (X)에 함수를 구현하려면 ‘void X :: Foo :: TheFunc () {}’를 사용하세요.


답변

.h 콘텐츠 만 래핑하는 경우 cpp 파일에서 namespace …를 사용하여 작성해야합니다. 그렇지 않으면 유효한 네임 스페이스에서 작업 할 때마다. 일반적으로 .cpp 및 .h 파일을 모두 래핑합니다. 그렇지 않으면 다른 네임 스페이스의 개체를 사용하여 많은 문제가 발생할 수 있습니다.


답변

여기서해야 할 옳은 일은 범위 지정을 위해 네임 스페이스를 사용하는 것입니다.

namespace catagory
{
    enum status
    {
      none,
      active,
      paused
    }
};

void func()
{
    catagory::status status;
    status = category::active;
}