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 Linkage나 No 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를 사용할 수 있음 (외부에서 연결됨)
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++의 링크 유형 (Linkage) - 3. External Linkage (외부 링크) (0) | 2025.03.27 |
---|---|
C++의 링크 유형 (Linkage) - 2. C++에서의 링키지 종류 (0) | 2025.03.27 |
C++ inline - 요약 (0) | 2025.03.27 |
C++ inline - 10. inline 함수 사용 시 주의할 점 (0) | 2025.03.27 |
C++ inline - 9. C++17 이후의 변화 (0) | 2025.03.27 |