2012-04-22 7 views

답변

66

C++에서 모든 이름은 존재하지 않는 범위를가집니다. 스코프는 여러 가지 방법으로 정의 할 수 있습니다 : 그것은 네임 스페이스, 기능, 클래스 그냥 {} 정의 할 수 있습니다.

전역 또는 다른 네임 스페이스는 범위를 정의합니다. 전역 네임 스페이스는 ::을 사용하며이 네임 스페이스에 정의 된 기호는 전역 범위라고합니다.

int a; //this a is defined in global namespace 
     //which means, its scope is global. It exists everywhere. 

namespace N 
{ 
    int a; //it is defined in a non-global namespace called `N` 
      //outside N it doesn't exist. 
} 
void f() 
{ 
    int a; //its scope is the function itself. 
      //outside the function, a doesn't exist. 
    { 
     int a; //the curly braces defines this a's scope! 
    } 
} 
class A 
{ 
    int a; //its scope is the class itself. 
      //outside A, it doesn't exist. 
}; 

이 또한주의 :이 정의되어 있지 않으면 블록 키워드 namespace로 시작하거나,이 클래스의 멤버, 또는 함수의 지역 변수입니다 내부 심볼은 기본적으로 글로벌 네임 스페이스에 존재 이름이 인 경우 네임 스페이스, 함수 또는 클래스로 정의 된 내부 범위로 숨길 수 있습니다. 따라서 a 내부 이름 공간 N은 전역 이름 공간에 a이라는 이름을 숨 깁니다. 마찬가지로 함수와 클래스의 이름은 전역 이름 공간에서 이름을 숨 깁니다. 당신이 이러한 상황에 직면하면, 당신이 전역 네임 스페이스에 정의 된 이름을 참조하는 ::a를 사용할 수 있습니다

int a = 10; 

namespace N 
{ 
    int a = 100; 

    void f() 
    { 
     int a = 1000; 
     std::cout << a << std::endl;  //prints 1000 
     std::cout << N::a << std::endl; //prints 100 
     std::cout << ::a << std::endl; //prints 10 
    } 
} 
+0

함수 내에서 'a'(네임 스페이스 N에 정의 됨)에 액세스하려는 경우 어떻게해야합니까? void f() {} – rimiro

+0

@rimiro : 함수 범위에서 'a'가 선언 된 경우 * 외부 * 함수. – Nawaz

2

당신은 예를 들어 전역 변수 int i를 선언 할 때, 우리는 i is in the global namespacehas the global namespace scope을 말한다. 그게 다야. C++ 03에서

발췌 :

3.3.5 Namespace scope 

    The outermost declarative region of a translation unit is also a namespace, called 
    the global namespace. A name declared in the global namespace has global namespace 
    scope (also called global scope). 
4

"범위" "네임 스페이스"보다 더 일반적인 용어입니다. 모든 네임 스페이스, 클래스 및 코드 블록은 그 안에 선언 된 이름을 사용할 수있는 범위를 정의합니다. 네임 스페이스는 클래스와 함수 외부에서 선언 된 이름의 컨테이너입니다.

"전역 범위"와 "전역 네임 스페이스"는 어느 정도 호환 할 수 있습니다. 이름 공간에서 선언 된 이름의 범위는 해당 이름 공간 전체를 포함합니다. 네임 스페이스를 특별히 언급하고 있다면 "네임 스페이스"를 사용하고 그 안에 이름의 가시성을 언급하고 있다면 "범위"를 사용하십시오.

3

범위는 개체의 수명을 나타내며 프로그램이 실행되는 동안 존재하는 전역 변수를 가질 수 있으며 해당 코드 블록이 실행되는 동안 존재할 블록 범위의 변수를 가질 수 있습니다. 우리가 블록을 둘러싸 년대의 범위에 잎 maina을 재정의하고 있기 때문에,

local a is: 200를 인쇄 할 문을 실행
#include <iostream> 

int a = 100; 

main() { 
    int a = 200; 

    std::cout << "local a is: " << a << std::endl; 
    std::cout << "global a is: " << ::a << std::endl; 

    return 0; 
} 

가, 그 명백하게 예상되는이 예를 생각해 보자. 또한 전역 이름 공간 ::을 요청했기 때문에 ::a을 인쇄하여 예상 값 100을 다시 인쇄합니다.

이름 공간 의미론은 대부분 논리 적이므로 이름 충돌을 피하기 위해 symblos를 서로 분리하는 방법이며 개체 수명에 영향을주지 않습니다.

범위는 개체의 수명을 나타내며 글로벌 a은 로컬에서 실행되기 훨씬 이전에 생성되기 때문에 로컬 a 전에 존재합니다. 그러나 범위도 을 기호의 네임 스페이스로 설정하지만 namespace과 동일한 방법은 아닙니다.

혼란스러운 부분이 범위는 때로는 뭔가 C에서 빌려 특정 기호의 가시성을 표시하기 위해 과부하이다 ... 범위의 다른 종류, global, class, function, block, file 등이있다 네임 스페이스의 개념은 존재하지 않았고 수명, 가시성을 나타내는 데 스코프가 사용되었습니다. 그러나 C++에서는 규칙이 약간 변경되었지만 범위 인은 여전히 ​​두 가지 언어가 많은 개념을 공유하기 때문에 같은 방식으로 사용됩니다.

+0

범위가 객체의 수명에 내재한다는 생각을 강조 했음 좋겠습니다. –

2

@Dmitriy Ryajov

주제는 조금 오래 그러나 나는 이것에 대해 내 도움을 제공하고자합니다. 나는 당신이 실제로하는 것보다 더 복잡한 것을 만들어서는 안된다고 생각합니다. 식별자의 Scope은 프로그램의 일부 엔티티를 나타내는 이름 인 식별자가 참조 된 엔티티를 찾는 데 사용될 수있는 컴퓨터 프로그램의 일부입니다. 따라서 scope라는 용어는 식별자에만 적용되며 객체의 수명과 섞어서는 안됩니다. 그들은 다소 연결되어 있지만 혼동해서는 안됩니다. 객체의 수명은 객체에 대한 메모리를 할당하는 위치로 표시됩니다. 예를 들어 스택에 메모리가 할당 된 경우 함수가 완료 되 자마자 메모리가 해제됩니다. 그래서 우리가 객체를 저장하는 위치에 따라 달라지며 객체의 수명을 나타냅니다. 범위는 "여기에 객체의 이름이 있습니다. 그리고 그때까지 객체에 대해이 이름을 사용할 수 있습니다." 그래서 제가 말했듯이, scope이라는 용어는 객체의 식별자만을위한 것이며, 수명은 우리가 객체를 저장 한 곳으로 표시되는 다른 것입니다.

또한이 내용과 밀접하게 관련된 linkage에 대해 이야기하고 싶습니다. 이것은 때때로 혼란 스러울 수도 있습니다. 어떤 객체를 참조하는 식별자가 translation unit에 있다고 가정 해 봅시다. other 번역 단위의 동일한 식별자가 동일한 항목을 참조하는지 여부는 연결로 표시됩니다. 예를 들어, 식별자에 외부 연결이있는 경우이 식별자가 참조하는 엔터티를 참조 할 수 있지만 다른 변환 단위는 extern 키워드로 선언하여 참조 할 수 있습니다. 이제 다른 번역 단위에서 해당 엔티티를 사용하고 싶지 않다고 가정 해 봅시다. 그런 다음 엔티티는 프로그램이 끝날 때까지 exist이되지만 선언하지 않으면 참조 할 수 없습니다. 또한 지금 나는 연계와 생애라는 용어를 섞어 놓았다. 그러나 이는 외부 연결이있는 global 엔티티 만 있기 때문입니다. 함수 내부의 식별자는 프로그램의 다른 부분을 참조 할 수 없습니다.

결론 : 항상 간단한 것을 유지하십시오. 나는 다른 사람들이이 용어에 대해 어떻게 다른지 이야기하는 것에 놀랐다. 거의 동일한 의미를 지닌 여러 용어가 있기 때문에 각기 다른 컴파일 과정이 혼란 스럽습니다.

관련 문제