C ++ : 네임 스페이스 — 헤더 및 소스 파일에서 올바르게 사용하는 방법은 무엇입니까?
인터페이스 선언 파일 ( *.h
또는 *.hpp
)과 해당 구현 파일 ( *.cpp
) 의 두 소스 파일 쌍을 고려하십시오 .
송출 *.h
파일에 다음처럼 :
namespace MyNamespace {
class MyClass {
public:
int foo();
};
}
소스 파일에서 네임 스페이스를 사용하는 두 가지 다른 사례를 보았습니다.
*.cpp
연습 # 1 보여주기 :
#include "MyClass.h"
using namespace MyNamespace;
int MyClass::foo() { ... }
*.cpp
연습 # 2 보여주기 :
#include "MyClass.h"
namespace MyNamespace {
int MyClass::foo() { ... }
}
내 질문 : 이 두 관행 사이에 차이점이 있으며 하나가 다른 것보다 더 나은 것으로 간주됩니까?
코드 가독성 관점에서 볼 때 이러한 이유로 # 2 방법을 사용하는 것이 제 생각에는 아마도 더 좋습니다.
한 using
번에 여러 개의 네임 스페이스 가 될 수 있으며 해당 줄 아래에 작성된 모든 개체 또는 함수는 이러한 네임 스페이스 중 하나에 속할 수 있습니다 (이름 충돌 제외). 전체 파일을 namespace
블록으로 래핑하는 것이 더 명확하며 .cpp 파일 내에서 해당 네임 스페이스에 속하는 새 함수와 변수를 선언 할 수도 있습니다.
가장 분명한 것은 표시하지 않은 옵션입니다.
int MyNamespace::MyClass::foo()
{
// ...
}
또한 매우 장황합니다. 대부분의 사람들에게 너무 많이. 때문에 using namespace
내 경험에 적어도 이름 충돌에 대한 recepe이, 그리고 매우 제한된 범위와 장소를 제외하고 피해야한다, 나는 일반적으로 당신의 # 2를 사용합니다.
이 두 관행 사이에 차이점이 있습니까?
예. # 1 및 # 2는 각각 using-directive 및 네임 스페이스 정의의 예 입니다. 이 경우에는 사실상 동일하지만 다른 결과가 있습니다. 예를 들어,와 함께 새 식별자를 도입 MyClass::foo
하면 다른 범위를 갖게됩니다.
#1:
using namespace MyNamespace;
int x; // defines ::x
# 2 :
namespace MyNamespace {
int x; // defines MyNamespace::x
}
하나가 다른 것보다 더 나은 것으로 간주됩니까?
# 1 장점 : 조금 더 간결합니다. 우연히 무언가를 MyNamespace
무의식적으로 도입하기가 더 어렵습니다 . 단점 : 기존 식별자를 의도하지 않게 가져올 수 있습니다.
# 2 장점 : 기존 식별자의 정의와 새 식별자의 선언이 모두 MyNamespace
. 단점 : 실수로 MyNamespace
.
# 1과 # 2에 대한 비판은 .NET Framework의 멤버 정의에만 관심이있을 때 전체 네임 스페이스를 참조한다는 것입니다 MyNamespace::MyClass
. 이것은 무겁고 의도를 제대로 전달하지 않습니다.
# 1의 가능한 대안 은 관심있는 식별자 만 포함 하는 using-declaration 입니다.
#include "MyClass.h"
using MyNamespace::MyClass;
int MyClass::foo() { ... }
또한 cpp 파일에 템플릿 전문화를 구현해야하는 이유 때문에 결정 using namespace
하고 다음 문제가 발생할 것이라는 점 을 추가하고 싶습니다 .
// .h file
namespace someNameSpace
{
template<typename T>
class Demo
{
void foo();
};
}
// .cpp file
using namespace someNameSpace;
template<typename T>
void Demo<T>::foo(){}
// this will produce
// error: specialization of 'template<class T> void someNameSpace::Demo<T>::foo()' in different namespace [-fpermissive]
template<>
void Demo<int>::foo(){}
그렇지 않으면 # 2 방법을 적용하면 괜찮습니다.
using-declaration을 사용 하여 한 가지 더 방법을 추가하고 싶습니다 .
#include "MyClass.h"
using MyNamespace::MyClass;
int MyClass::foo() { ... }
이렇게하면 클래스에 많은 함수가있는 경우 네임 스페이스 이름을 여러 번 입력하지 않아도됩니다.
'Program Tip' 카테고리의 다른 글
Pylint가 내장 함수를 좋아하지 않는 이유는 무엇입니까? (0) | 2020.10.24 |
---|---|
junit 테스트 클래스에서 Spring 애플리케이션 컨텍스트 재사용 (0) | 2020.10.24 |
CSS 세로 정렬이 float에서 작동하지 않음 (0) | 2020.10.24 |
한 원숭이가 파이썬에서 함수를 어떻게 패치합니까? (0) | 2020.10.24 |
창 크기 조정시 Google 차트 다시 그리기 / 크기 조정 (0) | 2020.10.24 |