C++의 링크 유형 (Linkage) - 8. 실전 예제와 사례 분석

2025. 3. 27. 21:11프로그래밍 언어/C++

 

✅ 8. 실전 예제와 사례 분석

🔹 [예제 1] 외부 링크 변수와 함수 정의 분리 예시

📁 config.h – 선언만 작성

#ifndef CONFIG_H
#define CONFIG_H

extern int globalSetting;   // 외부 선언
void printSetting();        // 함수 선언

#endif

📁 config.cpp – 정의 작성

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

int globalSetting = 42;     // 외부 링크 정의

void printSetting() {
    std::cout << "Setting: " << globalSetting << std::endl;
}

📁 main.cpp

#include "config.h"

int main() {
    printSetting();         // 다른 파일에 정의된 함수 사용
    return 0;
}

✅ 이 구조는 외부 링크를 이용한 헤더-구현 분리의 전형적인 형태이며, ODR(One Definition Rule)을 잘 지키는 예입니다.


🔹 [예제 2] 내부 링크를 활용한 파일 간 캡슐화

📁 internal.cpp

static int counter = 0;     // 내부 링크 → 다른 파일에 노출 안 됨

static void log() {
    std::cout << "Logging...\n";
}

void increase() {
    ++counter;
    log();
}

📁 main.cpp

void increase();  // 내부 함수는 접근 불가, 외부 함수만 사용

int main() {
    increase();    // 내부 상태는 숨겨진 채로 사용 가능
}

✅ static을 통해 파일 단위의 정보 은닉 및 모듈화를 실현


🔹 [예제 3] const, inline, static 변수의 링크 특성 비교

📁 example.cpp

const int a = 1;             // Internal Linkage (C++17 이전 기준)
static int b = 2;            // Internal Linkage
inline int c = 3;            // External Linkage (C++17 이후)

void show() {
    std::cout << a << ", " << b << ", " << c << std::endl;
}

✅ 요약:

변수 링크 유형 설명
a Internal const 변수는 기본적으로 내부 링크
b Internal static 변수는 내부 링크
c External C++17 이후 inline 변수는 외부 링크 가능

🔹 [사례] 실제 다중 파일 프로젝트에서 발생하는 링크 오류

❌ 1. 중복 정의 오류 (multiple definition)

// a.cpp
int id = 1;

// b.cpp
int id = 2;  // ❌ 오류: multiple definition of `id`

🔧 해결 방법:

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

// a.cpp
int id = 1;     // 정의는 한 번만

❌ 2. 참조되지 않은 정의 오류 (undefined reference)

// header.h
extern int value;

// main.cpp
#include "header.h"
std::cout << value;  // ❌ undefined reference to `value`
// 정의가 없음

🔧 해결 방법:

// value.cpp
int value = 100;  // 정의 추가

📝 정리

링키지 특성을 잘 이해하고 활용하면 다음을 달성할 수 있습니다:

  • 전역 상태 공유 (외부 링크)
  • 정보 은닉 및 충돌 방지 (내부 링크)
  • C++17 이후 inline 변수 도입으로 헤더 관리 개선
  • 실전에서 자주 발생하는 링커 오류 예방