콘텐츠로 이동

내부 연결 (Internal Linkage)

.cc 파일의 정의를 해당 파일 외부에서 참조할 필요가 없다면, 이름 없는(unnamed) 네임스페이스에 넣거나 static으로 선언하여 내부 연결(internal linkage)을 부여하세요. .h 파일에서는 이 두 가지 중 어느 것도 사용하지 마세요.

모든 선언은 이름 없는 네임스페이스에 넣어 내부 연결을 부여할 수 있습니다. 함수와 변수는 static으로 선언해도 내부 연결을 줄 수 있습니다. 내부 연결이란 선언한 대상에 다른 파일에서 접근할 수 없다는 뜻입니다. 다른 파일이 같은 이름의 항목을 선언하더라도, 두 엔터티는 완전히 독립적입니다.

다른 곳에서 참조할 필요가 없는 모든 코드에는 .cc 파일에서 내부 연결을 사용하는 것을 권장합니다. .h 파일에는 내부 연결을 사용하지 마세요.

이름 없는 네임스페이스도 명명된 네임스페이스와 같은 방식으로 형식을 지정합니다. 끝을 표시하는 주석에서는 네임스페이스 이름을 비워 둡니다.

namespace {
...
}  // namespace

이해하기 쉽게 설명하기

내부 연결이란?

내부 연결(internal linkage)이 부여된 이름은 그 이름이 선언된 번역 단위(보통 하나의 .cc 파일) 안에서만 보입니다. 다른 파일에서는 같은 이름이 있어도 서로 전혀 다른 별개의 대상입니다. 반대로 외부 연결(external linkage)은 다른 파일에서도 접근할 수 있습니다.

두 가지 방법

// 방법 1: 이름 없는 네임스페이스 (모든 선언에 적용 가능, 권장)
namespace {
void HelperUsedOnlyHere() { ... }
const int kLocalConstant = 42;
}  // namespace

// 방법 2: static (함수·변수에 한정)
static void AnotherHelper() { ... }

왜 .h 파일에서는 쓰면 안 되는가?

헤더는 여러 .cc 파일에 포함됩니다. 헤더에 내부 연결을 주면, 그 헤더를 포함하는 파일마다 별개의 복사본이 생깁니다. 이는 보통 의도와 다르며(불필요한 중복, 추적하기 어려운 버그), 코드 크기만 키웁니다. 그래서 헤더에서는 이름 없는 네임스페이스나 static을 쓰지 않습니다.

효과

  • 파일 내부 전용 구현을 외부에서 보이지 않게 숨김
  • 전역 이름 공간 오염 방지
  • 더 이상 쓰지 않는 내부 도우미를 안전하게 제거 가능