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 변수 도입으로 헤더 관리 개선
- 실전에서 자주 발생하는 링커 오류 예방
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++의 링크 유형 (Linkage) - 10. 요약 및 결론 (0) | 2025.03.27 |
---|---|
C++의 링크 유형 (Linkage) - 9. 링키지 관련 베스트 프랙티스 (0) | 2025.03.27 |
C++의 링크 유형 (Linkage) - 7. 링키지와 이름 충돌 (Name Collision) (0) | 2025.03.27 |
C++의 링크 유형 (Linkage) - 6. 링키지에 영향을 주는 요소들 (0) | 2025.03.27 |
C++의 링크 유형 (Linkage) - 5. No Linkage (링크 없음) (0) | 2025.03.27 |