C++에서 '식별자가 선언된 위치를 검색하는 순서'이다
전역 함수인 경우
1. 현재 블록 범위
2. 현재 블록 범위를 포함하고 있는 상위 블록 범위 (최대 적용 범위는 함수 몸체까지)
3. 가장 최근에 선언된 변수나 함수
4. using 선언된 네임스페이스 혹은 전역 네임스페이스. 단, 두 곳에 동일한 식별자가 존재할 경우 컴파일 오류
클래스 메서드인 경우
1. 현재 블록 범위
2. 현재 블록 범위를 포함하고 있는 상위 블록 범위 (최대 적용 범위는 함수 몸체까지)
3. 클래스의 멤버
4. 부모 클래스의 멤버
5. 가장 최근에 선언된 전역 변수나 함수
6. 호출자 코드가 속한 네임스페이스의 상위 네임스페이스
7. using 선언된 네임스페이스 혹은 전역 네임스페이스. 단, 두 곳에 동일한 식별자가 존재할 경우 컴파일 오류
Ex.1 현재 블록 범위
가장 먼저 검색하는 범위는 접근하는 코드가 속한 블록 범위 ({ } 구간) 이다.
#include <iostream>
using namespace std;
int Data(20);
int main(void)
{
int Data(10);
cout << Data << endl; // 8번행 Data
return 0;
}
실행결과
Ex.2 상위 블록 범위
접근자 코드가 속해 있는 범위에서 식별자 선언을 찾지 못한다면 중첩된 블록 범위의 상위로 검색 범위를 확장한다.
#include <iostream>
using namespace std;
int main(void)
{
int Data = 0;
cout << "5 이상의 정수를 입력하세요" << endl;
cin >> Data;
if(Data > 5)
{
cout << Data << endl; // 7번행 Data
}
else
cout << "Error" << endl;
return 0;
}
실행결과
Ex.3 가장 최근에 선언된 전역 변수
전역 변수는 네임스페이스보다 선언 위치가 더 '우선' 하다.
#include <iostream>
using namespace std;
int Data = 200;
namespace Test
{
void TestFunc(void)
{
cout << Data << endl;
}
int Data = 100;
}
int main(void)
{
Test::TestFunc();
return 0;
}
이때 4번행의 Data와 7번행의 Data 중 어느것이 출력될지 예상해보자
실행결과
위와 같이 전역 변수는 네임스페이스를 생각하지 말고 선언 순서를 생각해야 한다.
ps. 만약 4번줄의int Data = 200;을 삭제하게 된다면?
정답은 100이 아닌 컴파일 오류가 발생한다.
Ex.4 using 선언과 전역 변수
using namespace를 통한 변수이름과 전역 변수의 이름이 같을 경우를 생각해보자.
#include <iostream>
using namespace std;
int Data = 100;
namespace Test
{
int Data = 200;
}
int main(void)
{
cout << Data << endl;
return 0;
}
4번행의 Data와 8번행의 Data중 어느것이 출력될까?
실행결과
그렇다면 위 예제의 Test 네임스페이스에 using 선언을 (10번행에) 추가한다면 결과는?
namespace Test { int Data = 200; } using namespace Test; int main(void) { ... }
위와같이 'ambiguous' 문구가 뜨면서 컴파일 오류가 나는 것을 확인할 수 있다.
실행결과
'Develop > C++' 카테고리의 다른 글
[C ++] 클래스 기본 문법 (0) | 2023.02.03 |
---|---|
[C ++] Namespace 와 using (0) | 2023.02.02 |
[C ++] 템플릿(Template) (1) | 2023.02.02 |
[C ++] 다중 정의 (Overloading) (0) | 2023.02.02 |
[C ++] 범위 기반 for문 (0) | 2023.02.02 |
댓글