C++의 링크 유형 (Linkage) - 3. External Linkage (외부 링크)

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

 

✅ 3. External Linkage (외부 링크)

🔹 개념 및 특징

External Linkage란,
하나의 식별자(변수 또는 함수)가 여러 번역 단위(소스 파일)에서 동일한 이름으로 참조될 수 있는 링크 특성을 말합니다.

  • 다른 소스 파일에서도 접근 가능
  • 프로그램 전체에서 하나의 엔티티로 공유
  • 전역 변수 및 함수는 기본적으로 external linkage를 가짐
  • ODR(One Definition Rule) 준수가 반드시 필요

🔹 적용 대상

  • 전역 변수
  • 전역 함수
  • extern 키워드로 선언된 식별자
  • C++17 이후: inline 변수도 External Linkage를 가짐

🔹 extern 키워드의 의미와 사용법

extern은 “정의는 다른 곳에 있다”는 것을 컴파일러에게 알려주는 선언용 키워드입니다.
헤더 파일에는 주로 extern 선언만 작성하고, 실제 정의는 .cpp 파일에 둡니다.

📌 예시:

// common.h
extern int counter;  // 선언만 있음

// main.cpp
#include "common.h"
int counter = 0;     // 정의 (External Linkage)

🔹 선언과 정의가 분리될 수 있는 이유

C++은 선언(declaration)정의(definition)를 분리할 수 있도록 설계되어 있습니다.
이를 통해 헤더 파일은 선언만 포함하고, 실제 메모리 할당은 하나의 소스 파일에서만 수행합니다.

이 구조는 다음과 같은 이점을 가집니다:

  • 코드 재사용성 증가
  • 인터페이스와 구현 분리
  • 컴파일 속도 개선

🔹 다중 파일에서 External Linkage 사용 예

📁 common.h

#ifndef COMMON_H
#define COMMON_H

extern int globalValue;  // 선언
void printValue();

#endif

📁 main.cpp

#include "common.h"

int globalValue = 42;    // 정의 (External Linkage)

int main() {
    printValue();
    return 0;
}

📁 util.cpp

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

void printValue() {
    std::cout << "Value: " << globalValue << std::endl;
}

📌 출력 결과:

Value: 42

🔹 주의할 점: 중복 정의 방지 (Linker Error)

External Linkage를 가진 식별자는 프로그램 전체에서 단 한 번만 정의되어야 합니다.
다중 파일에서 실수로 중복 정의하면 링커(Linker) 에러가 발생합니다.

📌 잘못된 예:

// file1.cpp
int shared = 1;

// file2.cpp
int shared = 2;  // ❌ 중복 정의 → "multiple definition of `shared`"

✅ 해결 방법:

// header.h
extern int shared;  // 선언만

// file1.cpp
int shared = 1;     // 정의는 오직 한 곳만!

이렇게 External Linkage는 다중 파일 간 공유를 가능하게 하며, 프로젝트 구조화와 모듈화의 핵심 개념입니다.
하지만 반드시 ODR 준수정의의 단일성을 기억해야 합니다.