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 | 지역 변수, 함수 매개변수, 클래스 멤버 | 없음 |
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++의 링크 유형 (Linkage) - 4. Internal Linkage (내부 링크) (0) | 2025.03.27 |
---|---|
C++의 링크 유형 (Linkage) - 3. External Linkage (외부 링크) (0) | 2025.03.27 |
C++의 링크 유형 (Linkage) - 1. 링키지(Linkage)란? (0) | 2025.03.27 |
C++ inline - 요약 (0) | 2025.03.27 |
C++ inline - 10. inline 함수 사용 시 주의할 점 (0) | 2025.03.27 |