C++의 링크 유형 (Linkage) - 7. 링키지와 이름 충돌 (Name Collision)
2025. 3. 27. 21:08ㆍ프로그래밍 언어/C++
✅ 7. 링키지와 이름 충돌 (Name Collision)
🔹 동일한 이름의 변수 또는 함수가 여러 파일에 있을 경우
링키지가 External일 때,
여러 소스 파일에서 동일한 이름의 전역 변수나 함수를 정의하면 링커 단계에서 충돌이 발생합니다.
📌 예시 – 이름 충돌 발생:
// a.cpp
int config = 1; // External Linkage
// b.cpp
int config = 2; // ❌ 충돌: "multiple definition of `config`"
→ 링커는 프로그램 전체에서 config가 하나만 있어야 한다는 ODR(One Definition Rule)에 따라 오류를 발생시킴.
🔹 내부 링크(Internal Linkage)와 외부 링크(External Linkage)의 이름 관리 전략
구분 | 전략 | 설명 |
External Linkage | 전역 이름은 중복 정의 금지, 헤더 파일에는 extern 선언만 | 정의는 반드시 하나의 .cpp 파일에만 |
Internal Linkage | 파일마다 동일한 이름 사용 가능 | static 또는 anonymous namespace 사용으로 독립된 정의 유지 가능 |
📌 예시 – 이름 충돌 방지:
// a.cpp
static int counter = 0; // Internal Linkage
// b.cpp
static int counter = 0; // 충돌 없음 (서로 다른 번역 단위에서만 유효)
📌 예시 – anonymous namespace 사용:
// a.cpp
namespace {
int temp = 1;
}
// b.cpp
namespace {
int temp = 2; // 문제 없음
}
🔹 컴파일러와 링커의 이름 해결 과정 (간단 설명)
C++ 빌드 과정은 두 단계로 나뉘어 이름을 처리합니다:
✅ 1. 컴파일러 단계
- 각 소스 파일(.cpp)은 독립적으로 컴파일됨 → 객체 파일(.o) 생성
- 이때 식별자의 링키지, 스코프, 타입 정보가 함께 기록됨
✅ 2. 링커 단계
- 모든 객체 파일을 하나로 연결하여 실행 파일을 생성
- 동일한 이름의 심볼이 여러 개 있으면 충돌 검사
- External Linkage에서 중복 정의가 감지되면 오류 발생
📌 요약:
- 컴파일러는 이름을 기억하고
- 링커는 이름을 실제로 연결(link)함
🔍 이름 충돌 방지 요령 정리
상황 | 방지 방법 |
전역 변수 정의 중복 | 정의는 한 곳에만 두고, 나머지는 extern 선언만 |
유사한 유틸리티 함수가 각 파일에 필요 | static 또는 anonymous namespace 사용 |
라이브러리 내부 구현 숨기기 | Internal Linkage 사용 + 헤더 분리 |
프로젝트 규모가 클수록 | namespace 활용하여 이름 구분 |
링키지는 단순한 기술 개념을 넘어 대규모 프로젝트에서의 코드 안전성과 유지보수성에 직접적인 영향을 미칩니다.
이름 충돌을 피하려면 올바른 링키지 설계와 키워드 사용이 필수입니다.
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++의 링크 유형 (Linkage) - 9. 링키지 관련 베스트 프랙티스 (0) | 2025.03.27 |
---|---|
C++의 링크 유형 (Linkage) - 8. 실전 예제와 사례 분석 (0) | 2025.03.27 |
C++의 링크 유형 (Linkage) - 6. 링키지에 영향을 주는 요소들 (0) | 2025.03.27 |
C++의 링크 유형 (Linkage) - 5. No Linkage (링크 없음) (0) | 2025.03.27 |
C++의 링크 유형 (Linkage) - 4. Internal Linkage (내부 링크) (0) | 2025.03.27 |