반응형

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
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
| C++의 Declaration에 대한 해석(interpretation) 명시 vs 의미적 속성(semantic properties) (0) | 2025.10.19 |
|---|---|
| C++의 underlying entity과 module 관계 (0) | 2025.10.18 |
| pointer conversions에 대해 (0) | 2024.03.02 |
| floating-integral conversion에 대해 (0) | 2024.03.01 |
| floating-point conversion에 대해 (0) | 2024.02.29 |