식별자가 선언된 위치를 검색하는 순서
- 자신이 속한 블록 범위
- 상위 블록 범위
- 가장 최근에 선언된 전역 변수
- using 선언과 전역 변수
1. 자신이 속한 블록 범위
int nData(20); //(1)
int _tmain(int argc, _TCHAR* argv[]){
int nData(10); //(2)
cout << nData << endl; //(2)를 사용한다. 현재 블록 범위에 있기때문
return 0;
}
2. 상위 블록 범위
int nInput = 10; //(1)
int _tmain(int argc, _TCHAR* argv[]){
int nInput = 0; //(2)
if(nInput > 10){
cout << nInput << endl; //(2)를 사용한다. 중첩된 블록 범위의 상위로 검색 범위를 확장
}
}
3. 가장 최근에 선언된 전역 변수
int nData = 200; //(1)
namespace TEST{
int nData = 100; //(2)
void TestFunc(void){
cout << nData << endl; //(2)를 사용한다. 이 줄 입장에서는 (2)가 가장 최근에 선언된 변수이기 때문
}
}
int _tmain(int argc, _TCHAR * argv[]){
Test::TestFunc();
return 0;
}
int nData = 200; //(1)
namespace TEST{
void TestFunc(void){
cout << nData << endl; //(1)를 사용한다.
//전역변수는 네임스페이스를 생각하지 말고 선언 순서를 생각해야한다.
//이 줄보다 (1)이 먼저 선언됐으므로 (1)을 사용
}
int nData = 100; //(2) << 앞라인에서는 호출 할 수 없다.
}
int _tmain(int argc, _TCHAR * argv[]){
Test::TestFunc();
return 0;
}
4. using 선언과 전역 변수
int nData = 100; //(1)
namespace TEST{
int nData = 200; //(2)
}
int _tmain(int argc, _TCHAR * argv[]){
cout << nData < endl; //(1)을 사용한다.
//탐색 순서라기 보다는 네임스페이스를 지정하지 않았으니 당연히 전역네임스페이스에 있는 식별자가 선택된다.
return 0;
}
int nData = 100; //(1)
namespace TEST{
int nData = 200; //(2)
}
using namespace TEST;
int _tmain(int argc, _TCHAR * argv[]){
cout << nData < endl; //컴파일 오류. _tmain()함수에서 nData변수에 접근하는 코드는
//전역 네임스페이스에 속한 nData와 TEST 네임스페이스에 속해있는 nData 모두가 해당된다.
return 0;
}
//오류를 해결하기 위해서는
::nData 라고 범위 지정 식별자를 기술하거나
Test::nData 라고 정확히 네임스페이스를 기술해야 한다.
'◼️C++' 카테고리의 다른 글
[C++] 클래스 기본 문법 (0) | 2023.09.17 |
---|---|
[C++] 객체지향 프로그래밍 개요 (0) | 2023.09.17 |
[C++] 네임스페이스, using, 네임스페이스 중첩, 네임스페이스 다중정의 (0) | 2023.09.06 |
[C++] 인라인 함수 (0) | 2023.09.05 |
[C++] 함수다중정의(오버로딩), 템플릿 함수 (0) | 2023.09.05 |