C++의 링크 유형 (Linkage) - 1. 링키지(Linkage)란?

2025. 3. 27. 19:54프로그래밍 언어/C++

 

✅ 1. 링키지(Linkage)란?

🔸 링키지의 정의

링키지(Linkage)는 C++에서 하나의 식별자(변수나 함수 등)가 여러 번역 단위(translation unit)에서 같은 엔티티로 인식될 수 있는지 여부를 결정하는 개념입니다.

  • 링키지는 코드의 파일 간 연결 여부를 다루며,
    특히 전역 변수함수처럼 파일 간 공유가 필요한 식별자에서 중요하게 작용합니다.

📌 번역 단위(Translation Unit)란?
하나의 .cpp 소스 파일과 그 안에서 #include로 포함된 모든 헤더 파일을 컴파일한 결과입니다.
C++에서는 각 .cpp 파일이 독립적인 번역 단위로 처리됩니다.


🔸 링키지와 스코프(Scope)의 차이

항목 설명
스코프(Scope) 이름이 유효한 코드의 범위를 결정(예: 블록, 함수, 전역 등)
링키지(Linkage) 이름이 다른 번역 단위에서 공유될 수 있는지를 결정

📌 예시:

int a = 10;         // 전역 스코프 + External Linkage
static int b = 20;  // 전역 스코프 + Internal Linkage
void func() {
    int c = 30;     // 지역 스코프 + No Linkage
}
  • a는 다른 파일에서도 접근 가능
  • b는 정의된 파일 안에서만 유효
  • c는 블록 안에서만 존재

🔸 선언(Declaration) vs 정의(Definition)

구분 설명 예시
선언 (Declaration) 식별자가 있음을 알림 (메모리는 할당되지 않음) extern int x;
정의 (Definition) 실제로 메모리를 할당하고 초기화함 int x = 10;
  • 선언은 여러 번 가능하지만,
  • 정의는 전체 프로그램에서 단 한 번만 가능 (→ ODR 관련)

🔸 링키지와 ODR(One Definition Rule)의 관계

ODR (One Definition Rule)은 C++의 핵심 규칙 중 하나로,
"하나의 식별자(변수, 함수 등)는 프로그램 전체에서 단 하나의 정의만 가져야 한다"는 원칙입니다.

  • 링키지가 External인 경우, ODR 위반 시 컴파일은 성공하더라도 링커 단계에서 오류 발생
  • Internal LinkageNo Linkage는 ODR과 직접적인 충돌이 일어나지 않음

💡 예: 동일한 전역 변수를 a.cpp와 b.cpp에서 동시에 정의하면 ODR 위반 오류 발생


🔸 🔍 실전 예제: 다중 파일에서 External Linkage 사용하기

📁 common.h

// 선언만 존재 (정의 아님)
extern int counter;

void printCounter();

📁 main.cpp

#include "common.h"

int counter = 0; // 유일한 정의 (External Linkage)

int main() {
    counter++;
    printCounter();
    return 0;
}

📁 util.cpp

#include <iostream>
#include "common.h"

void printCounter() {
    std::cout << "Counter: " << counter << std::endl;
}

✅ 결과

Counter: 1

📝 설명

  • counter는 external linkage를 갖는 전역 변수
  • common.h에서는 선언(extern)만 하고,
    실제 정의는 main.cpp에 단 한 번 존재 → ODR 준수
  • util.cpp에서도 counter를 사용할 수 있음 (외부에서 연결됨)