네임 스페이스를 "사용하지"하려면 어떻게해야합니까?


86

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

using namespace xyzzy

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

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

아마도...

unusing namespace xyzzy;

3
QC 시스템으로 버그 보고서를 열어야 할 것입니다. qc.codegear.com
Kris Kumler

2
BTW, 자동 생성 된 헤더는 무엇입니까?
Kris Kumler

2
언젠가 C ++에는 모듈이 있고 다른 코드에 코드를 포함하면 더 나은 캡슐화 구조가 생깁니다. 그때까지는이 문제를 해결할 수있는 쉬운 방법이 없습니다. 자신의 코드를 네임 스페이스에 넣고 그렇게 참조하는 것을 고려하십시오.
Trevor Hickey

답변:


59

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

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

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

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


1
일반적으로 이것은 끔찍한 생각입니다. C ++ 헤더는 여기에 사용 된 것처럼 대체 네임 스페이스에 포함되지 않습니다.
Aaron

25
헤더 파일에도 using 지시문을 포함시키는 것은 끔찍한 생각입니다. 이것은 단순히 그 문제를 완화합니다.
Head Geek

4
자신의 네임 스페이스에 헤더를 배치하는 것은 해당 라이브러리에서 선언의 의미를 변경하므로 해결책이 아닙니다. (-1)
Richard Corden

4
그것은 전적으로 헤더에서 선언되는 것에 달려 있습니다.
Head Geek

1
이것이 정의되지 않은 행동 인 이유입니다.
Kris Kumler

56

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

예:

{
    using namespace xyzzy;

} // stop using namespace xyzzy here

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


그래도 블록에 포함을 래핑 할 수 있습니까?
Eclipse

예, 자동 생성 코드에는 적용되지 않습니다. 자동 생성 코드의 템플릿을 변경할 수 있습니까?
jk.

네, 이것은 그가 네임 스페이스를 사용하는 헤더 문제를 실제로 해결하지 못합니다.
Kip

불행히도 이것은 사실이 아닙니다. 시도해보십시오 :
Adam

namespace xyzzy {const int i {using namespace xyzzy; } // 여기서 xyzzy 네임 스페이스 사용 중지
Adam

17

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

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

10

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


그러나 이것은 제대로 작동하지 않는 것 같습니다. 적어도 모든 경우에 시도했습니다 (BCB6 사용). 그런 다음 충돌시 명시 적 네임 스페이스를 추가하는 방법으로 돌아 가곤했습니다. 더 나쁜 경우에는 유형 이름 충돌을 피하기 위해 헤더를 포함 시켰습니다.
Wolf

5

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


1

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


1
헤더 파일이 라이브러리에 대한 선언 인 경우 이름 변경 문제가 발생할 수 있습니다. 컴파일은 성공하지만 링커는 이미 다른 네임 스페이스에서 컴파일 되었기 때문에 정의를 찾을 수 없습니다.
Eclipse

-1
#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);
}

1
답을 설명 해주세요!
Mazz

다른 네임 스페이스 변수를 사용하는 범위 결정 연산자를 사용할 수 있습니다
나렌드라는 kumawat

3
질문을 해결하지 않음
MM
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.