네임 스페이스를 “사용하지”하려면 어떻게해야합니까? xyzzy … 내가 가장

내 개발 시스템 (Codegear C ++ Builder)의 모호한 점 중 하나는 자동 생성 된 헤더 중 일부가 …

using namespace xyzzy

… 내가 가장 원하거나 기대하지 않을 때 내 코드에 영향을 미치는 진술.

이것을 피하기 위해 이전 “using”문을 어떻게 든 취소 / 재정의 할 수있는 방법이 있습니까?

아마도…

unusing namespace xyzzy;


답변

아니. 그러나 잠재적 인 해결책이 있습니다. 다음과 같이 자체 네임 스페이스에 include 지시문을 포함하면 …

namespace codegear {
    #include "codegear_header.h"
} // namespace codegear

… 그런 다음 해당 헤더 내의 모든 using 지시문의 효과가 무효화됩니다.

어떤 경우에는 문제가 될 수 있습니다. 그렇기 때문에 모든 C ++ 스타일 가이드 는 헤더 파일에 “using namespace”지시문을 넣지 않는 것이 좋습니다 .


답변

아니요 , 네임 스페이스를 사용 취소 할 수 없습니다 . 당신이 할 수있는 유일한 일은- using namespace문을 블록에 넣어 범위를 제한하는 것입니다.

예:

{
    using namespace xyzzy;

} // stop using namespace xyzzy here

자동 생성 된 헤더에 사용되는 템플릿을 변경할 수 있습니다.


답변

충돌시 명시 적 네임 스페이스를 사용하면 멈출 수 있습니다.

string x; // Doesn't work due to conflicting declarations
::string y; // use the class from the global namespace
std::string z; // use the string class from the std namespace

답변

향후 참조를 위해 : XE 버전 이후로 다음과 같은 두려운 using namespace System;int 를 피하기 위해 #define 할 수있는 새로운 값이 있습니다 . DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE


답변

sed, perl 또는 기타 명령 줄 도구를 빌드 프로세스의 일부로 사용하여 생성 된 헤더를 생성 한 후 사용하기 전에 수정하는 것은 어떻습니까?


답변

Visual Studio 2005를 사용한 빠른 실험에서는 이러한 헤더를 자신의 명명 된 네임 스페이스에 포함시킨 다음 use이 네임 스페이스에서 필요한 것을 포함 할 수 있음을 보여줍니다 ( use숨길 네임 스페이스를 도입하므로 전체 네임 스페이스는 안 됨).


답변

#include<iostream>
#include<stdio.h>
namespace namespace1 {
    int t = 10;
}
namespace namespace2 {
    int t = 20;
}
int main() {
using namespace namespace1;
    printf("%d" , t);
    printf("%d" , namespace2::t);
}