네임스페이스(namespace)는 코드의 조직을 위해 고안되었으며, 이름 충돌을 방지하기 위해 사용됩니다(특히 큰 프로젝트와 라이브러리에서). 일반 네임스페이스는 클래스, 함수, 변수 등을 그룹화할 수 있습니다.
익명 네임스페이스(namespace { ... })는 하나의 파일 내에서 가시성 범위를 제한하는 데 사용됩니다 — 그 안에서 선언된 모든 것은 파일 외부에서 볼 수 없습니다. 이전에는 파일 수준에서 함수와 변수를 위해 static 수정자를 사용했지만, 현재는 익명 네임스페이스가 더 선호됩니다.
// mylib.cpp에서 namespace { void helper() { // ... } int hidden_var = 42; }
파일 수준에서 static으로 선언된 함수/변수와 익명 네임스페이스에서의 함수/변수가 항상 동일한 효과를 주는 것으로 볼 수 있나요?
답변:
아니요, 차이가 있습니다. static은 오직 현재 파일에서만 가시성을 제한합니다. 익명 네임스페이스의 객체는 동일한 지역 가시성을 가지지만, 각 컴파일 파일마다 고유한 이름을 부여받아 번역 단위 간의 이름 충돌을 방지합니다. 동시에 익명 네임스페이스는 중첩을 지원하고 클래스를 포함할 수 있지만 static은 지원하지 않습니다.
이야기
-구형 코드로의 마이그레이션 중 한 모듈은 변수에 대해 static을 사용하고, 다른 모듈은 같은 이름을 가진 변수를 static 없이 사용했습니다. 그 결과 변수의 다중 정의로 인해 링커 오류가 발생했습니다.
이야기
-대규모 프로젝트에서 여러 라이브러리를 병합하면서 서로 다른 파일의 static 함수 간에 보이지 않는 충돌이 발생했습니다(동일한 이름, 다른 구현). 결과적으로 하나의 라이브러리는 빌드 후 예측할 수 없는 동작을 하게 되었습니다.
이야기
-개발자는 클래스 선언을 익명 네임스페이스에 .cpp 파일에서만 배치하였고, 이로 인해 다른 파일에서 클래스에 접근할 수 없게 되어 모듈 아키텍처가 손상되었습니다.