내 개발 시스템 (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);
}