C++의 링크 유형 (Linkage) - 2. C++에서의 링키지 종류

2025. 3. 27. 20:02프로그래밍 언어/C++

 

✅ 2. C++에서의 링키지 종류

C++에서 식별자(변수, 함수 등)는 다른 번역 단위(translation unit)와 연결될 수 있는지 여부에 따라 다음 3가지 링키지(Linkage)로 분류됩니다:


🔹 1) External Linkage (외부 링크)

🔸 정의

여러 번역 단위에서 동일한 이름으로 참조할 수 있는 식별자
→ 전역에서 하나의 이름으로 공유됨

🔸 특징

  • 선언은 여러 번 가능하지만, 정의는 한 번만 가능 (ODR 준수 필요)
  • 다른 소스 파일에서도 접근 가능
  • 기본적으로 전역 변수함수는 External Linkage를 가짐

🔸 적용 대상

  • 전역 변수, 전역 함수
  • extern으로 선언된 변수/함수
  • C++17 이후의 inline 변수

✅ 예시

// common.h
extern int counter;  // 선언 (External Linkage)

// main.cpp
int counter = 0;     // 정의 (External Linkage)

// C++17 이후
inline int version = 1; // 여러 파일에 정의되어도 ODR 위반 아님

🔹 2) Internal Linkage (내부 링크)

🔸 정의

정의된 번역 단위(파일) 안에서만 사용할 수 있는 식별자
→ 다른 파일에서는 전혀 인식되지 않음

🔸 특징

  • 외부 접근이 차단됨
  • 이름 충돌 방지 및 캡슐화 목적
  • C++17 이전의 const 전역 변수도 Internal Linkage를 가짐

🔸 적용 대상

  • static 키워드로 선언된 전역 변수, 함수
  • anonymous namespace 내부 식별자
  • C++17 이전의 const 전역 변수

✅ 예시

// internal_var.cpp
static int id = 42;       // Internal Linkage

namespace {
    void helper() {}      // Internal Linkage via anonymous namespace
}

const int limit = 100;    // C++17 이전: Internal Linkage

📌 C++17 이후에는 const 전역 변수도 명시적으로 inline 지정하지 않으면 Internal Linkage를 유지합니다.


🔹 3) No Linkage (링크 없음)

🔸 정의

다른 어떤 번역 단위 또는 범위와도 연결되지 않는 식별자
→ 이름이 오직 해당 범위 안에서만 의미를 가짐

🔸 특징

  • 같은 이름이라도 각각 독립적인 존재로 간주됨
  • 외부에서 절대 접근 불가
  • 객체 이름은 있지만 연결은 전혀 없음

🔸 적용 대상

  • 지역 변수
  • 함수 매개변수
  • 클래스의 멤버 변수 및 멤버 함수 이름

✅ 예시

void func(int a) {
    int temp = 5;  // No Linkage
}

class MyClass {
    int value;     // No Linkage
};

🔍 정리 표

링크 유형 외부 접근 가능 주요 적용 대상 대표 키워드 / 예
External Linkage O 전역 변수, 함수, inline 변수(C++17~) extern, inline
Internal Linkage X static 전역 변수/함수, const 전역 변수(C++17 이전), anonymous namespace static
No Linkage X 지역 변수, 함수 매개변수, 클래스 멤버 없음