질문의 역사:
변수의 스코프는 프로그래밍 언어가 나타난 이래로 기본적인 개념입니다. C++에서 스코프 규칙은 새로운 표준이 도입되면서 상당히 발전했습니다 (로컬 선언부터 익명 네임스페이스, 람다 표현식 및 try/catch 블록에 이르기까지).
문제:
스코프를 잘못 이해하면 컴파일 타임 또는 실행 중에 오류가 발생할 수 있습니다. 예를 들어, 이름 충돌, 변수의 우연한 숨김, 메모리 누수, 초기화되지 않은 값 등이 있습니다.
해결책:
C++에서 스코프의 주요 수준은 다음과 같습니다:
식별자 검색 규칙(name lookup)을 기억하는 것이 중요합니다: 컴파일러는 가장 "가까운" 정의를 찾아보고, 그 다음 위로 올라갑니다.
코드 예:
#include <iostream> void func() { int x = 1; { int x = 2; // 외부 변수 x를 숨김 std::cout << x << '\n'; // 출력: 2 } std::cout << x << '\n'; // 출력: 1 } int x = 10; // 전역 변수 int main() { func(); std::cout << x << '\n'; // 출력: 10 }
주요 특징:
헤더 파일에서 어떤 함수에도 선언되지 않은 변수가 link-time 오류의 원인이 될 수 있습니까?
네! 변수가 단순히 int value로 선언된다면 (extern없이, C++17의 inline-variables와 인라인 초기화없이), 여러 정의가 생성되어 링크 단계에서 다중 정의 오류가 발생할 수 있습니다.
코드 예:
// myheader.h int globalVar = 5; // 나쁜: 정의가 아닌 선언
내부 블록 내에 동일한 이름의 변수를 선언하면 어떤 일이 발생합니까?
내부 변수는 외부 변수를 "숨기게" 되며, 내부 블록이 끝날 때까지 모든 참조는 내부 변수를 가리킵니다.
함수 헤더에서 선언된 변수가 다른 함수에서 접근 가능합니까?
아니요. 함수 본문 내에 선언(및 정의)된 변수는 해당 함수가 실행되는 동안만 존재하며, 함수 외부에서는 접근할 수 없습니다.
상태 저장을 위해 프로젝트에서 여러 소스 파일에 걸쳐 포함 헤더 파일로 정의된 전역 변수를 사용합니다.
장점: 어디서나 쉽게 접근할 수 있습니다.
단점: 디버깅 어려움, 다중 정의 (링커 오류), 스레드 안전성 결여, 예상치 못한 값.
로컬 변수를 사용하고 상태를 함수 매개변수를 통해 전달하며, 전역 변수가 거의 없거나 extern을 사용하여 네임스페이스로 캡슐화합니다.
장점: 코드의 투명성, 의존성 관리, 테스트 용이성.
단점: 전역 변수보다 코드가 더 많이 필요할 수 있음.