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


88

헤더와 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;
  }
} 

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

답변:


37

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

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


55

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

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


프로젝트와 스타일에 따라 다릅니다. 종종 모듈에 파일로드를위한 하나의 메인 네임 스페이스가 있으며 두 번째 스타일은 의미가 있습니다.
Nicholas Wilson

8

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

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


나는 그것이 }가장 끝에 있는 종결과 일치하기 때문에 그것을 스트레이라고 부르지 않을 것 입니다. 그러나, 나는 중복 괄호의 쌍을 부르는 것)
blubberdiblub

원래 버전을 확인하는 경우 @blubberdiblub, 문제는 편집 한, 당신은 이 ;-) 이탈 전화
해커 - 마이클 Krelin

1

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

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


1
나는 그것이 컴파일되지 않는다고 생각하지만 차이가 있기 때문이 아니라 길 잃은 것이 있기 때문에 {;-)
Michael Krelin-해커

차이점은 Foo :: TheFunc ()가 전역 네임 스페이스에서 선언되고 네임 스페이스 X에 정의되어 있다는 것입니다.
bert-jan

1

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


질문은 조금 오래되었지만 이것의 결과가 무엇인지 알고 있습니까? 즉, 그의 VS 케이스가 네임 스페이스에서 함수를 선언하는 방식에 문제가 발생하지만 그 외부에서 정의하는 방식에 문제가 있습니까?
Adam Goodwin

1

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


0

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

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

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

0

하나에서 다른 변수로 변수를 사용하려는 경우 외부화 한 다음 다음과 같이 소스 파일에서 초기화하는 것이 좋습니다.

// [.hh]
namespace example
{
   extern int a, b, c;
}
// [.cc]
// Include your header, then init the vars:
namespace example
{
   int a, b, c;
}
// Then in the function below, you can init them as what you want: 
void reference
{
    example::a = 0;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.