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 활용하여 이름 구분

링키지는 단순한 기술 개념을 넘어 대규모 프로젝트에서의 코드 안전성과 유지보수성에 직접적인 영향을 미칩니다.
이름 충돌을 피하려면 올바른 링키지 설계와 키워드 사용이 필수입니다.