본문 바로가기

프로그래밍 언어/C++

C++ 표준 문서에서 언급한 스코프(scope) 관련 용어

반응형

C++ 표준에서 정의한 스코프(scope) 관련 용어

기본 스코프 개념

  • scope (스코프): 선언이 유효한 프로그램의 영역
  • global scope (전역 스코프): 전체 프로그램을 포함하는 최상위 스코프
  • program point (프로그램 지점): 프로그램 내의 특정 위치

스코프 간의 관계

  • enclosing scope (포함 스코프): 특정 프로그램 지점을 포함하는 모든 스코프
  • immediate scope (직접 스코프): 특정 지점을 포함하는 가장 작은 스코프
  • parent scope (부모 스코프): 스코프 S를 포함하는 가장 작은 스코프
  • intervening scope (개입 스코프): 프로그램 지점 P와 스코프 S 사이에 위치하며, S를 포함하지만 P는 포함하지 않는 스코프

선언 관련 용어

  • declaration (선언): 엔티티(변수, 함수, 타입 등)를 도입하는 구문
  • locus (위치): 선언의 이름이 의미를 갖는 구체적인 프로그램 지점
  • inhabit (거주하다): 선언이 특정 스코프에 속하는 것 (기본적으로 선언의 locus에 대한 immediate scope)
  • target scope (목표 스코프): 선언이 거주하는 스코프 (기본값)
  • host scope (호스트 스코프): inhabited scope가 블록 스코프면 그것, 아니면 target scope

이름 바인딩

  • name binding (이름 바인딩): 선언이 도입한 이름을 target scope에서 해당 선언과 연결하는 것
  • (re)introduce (재도입): 이름이나 엔티티를 선언하거나 재선언하는 것
  • entity (엔티티): 선언의 대상이 되는 프로그램 요소 (변수, 함수, 타입, 네임스페이스 등)
  • belong to (속하다): 엔티티가 해당 스코프를 target scope로 하는 선언을 통해 그 스코프에 속하는 것
C++ 표준에서 정의하고 있는 스코프 유형

1. Block Scope (블록 스코프) - 6.4.3

다음 요소들이 블록 스코프를 도입합니다:

  • 선택문 또는 반복문 (if, switch, for, while 등)
  • 이러한 문장의 하위 문장 (substatement)
  • 예외 처리기 (handler)
  • 핸들러가 아닌 복합문 (compound statement { })

블록 스코프에 속하는 변수를 block variable이라고 합니다.

int i = 42;
for (int i = 0; i < 10; i++)  // 새로운 블록 스코프
  a[i] = i;
int j = i;  // j = 42 (외부 스코프의 i)

2. Function Parameter Scope (함수 매개변수 스코프) - 6.4.4

parameter-declaration-clause가 함수 매개변수 스코프를 도입합니다.

스코프의 범위는 상황에 따라 다릅니다:

  • 일반 함수: 가장 가까운 init-declarator, member-declarator, 또는 function-definition의 끝까지
  • 람다 함수: compound-statement의 끝까지
  • requires 표현식: requirement-body의 끝까지
  • deduction guide: deduction-guide의 끝까지

3. Lambda Scope (람다 스코프) - 6.4.5

lambda-expression이 람다 스코프를 도입합니다.

lambda-introducer [] 직후부터 시작하여 compound-statement의 끝까지 확장됩니다.

4. Namespace Scope (네임스페이스 스코프) - 6.4.6

namespace-definition이 네임스페이스 스코프를 도입합니다.

  • 동일한 네임스페이스 N에 대한 모든 namespace-definition의 namespace-body를 포함
  • **전역 스코프(global scope)**는 전역 네임스페이스의 네임스페이스 스코프입니다
 
namespace Q {
  namespace V { void f(); }
  void V::f() {  // V의 스코프 내
    void h();    // Q::V::h를 선언
  }
}

5. Class Scope (클래스 스코프) - 6.4.7

클래스 또는 클래스 템플릿의 선언이 클래스 스코프를 도입합니다.

  • class-specifier의 member-specification을 포함
  • 클래스 정의 이전 지점에서의 조회는 클래스 스코프에서 바인딩을 찾지 못함

6. Enumeration Scope (열거형 스코프) - 6.4.8

열거형 E의 선언이 열거형 스코프를 도입합니다.

  • enum-specifier의 enumerator-list를 포함
 
enum class Color { Red, Green, Blue };  // 열거형 스코프

7. Template Parameter Scope (템플릿 매개변수 스코프) - 6.4.9

템플릿 매개변수template-declaration이 템플릿 매개변수 스코프를 도입합니다.

특징:

  • template-parameter-list의 시작부터 template-declaration의 끝까지 확장
  • 오직 템플릿 매개변수만 템플릿 매개변수 스코프에 속함
  • 부모 스코프도 템플릿 매개변수 스코프인 유일한 스코프 종류

8. Contract-Assertion Scope (계약 단언 스코프) - 6.4.10

contract assertion(계약 단언)이 contract-assertion 스코프를 도입합니다.

  • 사후조건(postcondition)의 result-name과 관련된 충돌 검사 규칙 포함

요약

8가지 스코프 종류가 있으며, 각각 특정한 문법 구조에 의해 도입되고 고유한 범위와 규칙을 가집니다.

728x90
반응형