C ++에서 “using”선언의 범위는 무엇입니까? 스페이스에 추가합니다

C ++에서 ‘using’선언을 사용하여 std :: string 및 std :: vector를 로컬 네임 스페이스에 추가합니다 (불필요한 ‘std ::’입력을 저장하기 위해).

using std::string;
using std::vector;

class Foo { /*...*/ };

이 선언의 범위는 무엇입니까? 헤더에서이 작업을 수행하면 헤더를 포함하는 모든 cpp 파일에 이러한 ‘사용’선언을 삽입합니까?



답변

C ++에서 헤더 파일을 #include하면 헤더 파일의 전체 내용이 소스 파일에 포함 된 지점에 배치됩니다. 따라서 using선언이있는 using파일을 포함하면 해당 헤더 파일을 포함하는 각 파일의 맨 위에 선언 을 배치하는 것과 똑같은 효과가 있습니다.


답변

using선언을 차단하는 헤더 파일에는 특별한 것이 없습니다 . 컴파일이 시작되기 전에 간단한 텍스트 대체입니다.

using선언을 범위로 제한 할 수 있습니다 .

void myFunction()
{
   using namespace std; // only applies to the function's scope
   vector<int> myVector;
}

답변

using 문의 범위는 코드에서 위치에 따라 다릅니다.

  • 파일의 맨 위에 위치하며 해당 파일 전체에 범위가 있습니다.
  • 이것이 헤더 파일 인 경우 해당 헤더를 포함하는 모든 파일에 범위가 있습니다. 일반적으로 이것은 예상치 못한 부작용을 일으킬 수 있으므로 ” 좋은 생각아닙니다
  • 그렇지 않으면 using 문은 발생 지점부터 블록 끝까지 포함하는 블록 내에 범위를 갖습니다. 메서드 내에 배치되면 해당 메서드 내에 범위가 있습니다. 클래스 정의 내에 배치되면 해당 클래스 내에 범위가 있습니다.

답변

범위는 using 선언이있는 범위입니다.

이것이 전역 범위 인 경우 전역 범위에 있습니다. 헤더 파일의 전역 범위에있는 경우 헤더를 포함하는 모든 소스 파일의 전역 범위에 있습니다.

따라서 일반적인 조언은 헤더 파일의 전역 범위에서 선언을 사용하지 않는 것 입니다.


답변

인용 된 경우 파일 ( “번역 단위”)은이를 포함하는 모든 파일을 의미합니다.

클래스 내부에 using 문을 넣을 수도 있습니다.이 경우 해당 클래스에만 적용됩니다.

일반적으로 헤더에 네임 스페이스를 지정해야하는 경우 필요한 모든 식별자를 완전히 정규화하는 것이 가장 좋습니다.


답변

맞아요. 범위는 using선언 을 사용하는 모듈입니다 . 모듈에 포함 된 헤더 파일에 using선언이있는 경우 해당 선언의 범위는 해당 모듈과 동일한 헤더를 포함하는 다른 모듈이됩니다.


답변

그들이 “하지 마라”라고 말할 때 다소 부적합한 댓글이 몇 개 있습니다. 너무 엄격하지만 괜찮을 때 이해해야합니다.

글쓰기 using std::string는 결코 괜찮지 않습니다. using ImplementationDetail::Foo자신의 헤더에 작성 하면 해당 헤더가 ImplementationDetail :: Foo를 선언 할 때도 괜찮을 수 있습니다. 예

namespace MyNS {
    namespace ImplementationDetail {
        int Foo;
    }
    using ImplementationDetail::Foo;
}