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 변수 사용