C++의 링크 유형 (Linkage) - 9. 링키지 관련 베스트 프랙티스
2025. 3. 27. 22:43ㆍ프로그래밍 언어/C++
✅ 9. 링키지 관련 베스트 프랙티스
🔹 1) 헤더 파일에서는 extern 사용, 정의는 소스 파일(.cpp)에
📌 원칙
- 헤더 파일에는 선언만 (extern)
- 실제 정의는 하나의 .cpp 파일에만 작성
📌 이유
- 다수의 파일에서 같은 헤더를 include할 때 중복 정의(linker error) 방지
- ODR(One Definition Rule)을 지키는 기본 방식
✅ 예시
// config.h
extern int configValue; // 선언만
// config.cpp
int configValue = 10; // 정의는 딱 한 번만!
🔹 2) 전역 변수 지양 → 내부 링크 또는 클래스 내부로 캡슐화
📌 원칙
- 전역 변수는 최소화 또는 사용 금지
- 불가피할 경우 static, anonymous namespace, 또는 클래스 내부 정적 멤버로 한정
✅ 예시: 클래스 내부 정적 변수
class Logger {
public:
static int logCount; // 외부 접근은 통제된 방식으로
};
→ 상태를 클래스 내부에 두면 제어 가능성과 모듈화 수준이 높아짐
🔹 3) anonymous namespace vs static의 선택 기준
항목 | static | anonymous namespace |
적용 대상 | 변수, 함수 | 변수, 함수, 클래스, 타입 등 |
사용 시점 | C 스타일, 오래된 방식 | 현대 C++ 스타일, 더 강력하고 유연 |
추천 여부 | 구식 프로젝트에서만 사용 | C++에서는 기본적으로 권장됨 |
✅ 예시: anonymous namespace
namespace {
int localOnly = 5; // Internal Linkage
class Helper {}; // 타입도 숨김 가능
}
🔹 4) C++17 이후 inline 변수 사용 시 주의점
📌 핵심 개념
- inline 변수는 External Linkage를 가짐
- 여러 파일에서 동일한 정의가 있어도 ODR 위반 아님
- 단, 헤더 파일 외부에서는 정의하지 말 것
📌 올바른 사용 예
// config.h
inline int version = 1; // 헤더에 선언+정의 OK
❌ 잘못된 사용 예
// a.cpp
inline int version = 1;
// b.cpp
inline int version = 1; // 🔴 컴파일은 되지만 유지보수 시 혼란 유발
✅ 정리:
- inline 변수는 헤더 전용
- 정의는 한 곳에서 관리하는 편이 좋음 (설계상 일관성 유지)
📝 정리 – 안정적인 코드 작성을 위한 링크 전략
목적 | 권장 전략 |
전역 변수 사용 | 최소화하고 static 또는 클래스 내부로 캡슐화 |
내부 구현 숨기기 | anonymous namespace 활용 |
인터페이스 분리 | extern 선언은 헤더, 정의는 .cpp 파일 |
공유 상수 값 | C++17 이상에서는 inline const 변수 사용 |
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ I/O 및 파일 조작 - 1. 개요 (Introduction) (0) | 2025.03.30 |
---|---|
C++의 링크 유형 (Linkage) - 10. 요약 및 결론 (0) | 2025.03.27 |
C++의 링크 유형 (Linkage) - 8. 실전 예제와 사례 분석 (0) | 2025.03.27 |
C++의 링크 유형 (Linkage) - 7. 링키지와 이름 충돌 (Name Collision) (0) | 2025.03.27 |
C++의 링크 유형 (Linkage) - 6. 링키지에 영향을 주는 요소들 (0) | 2025.03.27 |