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