Abseil Tip 119 using 선언과 네임스페이스 별칭 사용하기

주간 팁 #119: using 선언과 네임스페이스 별칭 사용하기

원래 게시일: 2016-07-14
작성자: Thomas Köppe (tkoeppe@google.com)

이 팁은 .cc 파일에서 using 선언과 네임스페이스 별칭을 작성할 때 발생할 수 있는 미묘한 문제를 피하기 위한 간단하고 견고한 방법을 제공합니다.

요약

권장사항:

  1. 헤더 파일에서 네임스페이스 별칭이나 using 선언을 사용하지 마십시오.
    • 이러한 별칭은 구현자나 구현을 읽는 사람을 위한 편의 기능으로만 사용되어야 하며, 내보내는 API의 일부가 아닙니다.
  2. 별칭 선언은 가장 안쪽 네임스페이스(익명 네임스페이스 포함) 안에 배치하십시오.
    • 별칭 선언을 위해 익명 네임스페이스를 새로 만들지 마십시오.
  3. 별칭을 선언할 때 항상 완전히 수식된 이름(앞에 ::가 붙은 이름)을 사용하십시오.
    • 단, 현재 네임스페이스 안의 이름을 참조하는 경우는 예외입니다.
  4. 다른 이름을 사용할 때는 불필요한 완전 수식을 피하십시오.
    • 관련 정보는 TotW 130에서 확인하세요.

배경

C++는 이름을 네임스페이스로 구성합니다.
이 기능은 코드베이스가 커지더라도 이름 충돌을 방지하며, 소유 범위를 명확히 합니다. 그러나 네임스페이스는 종종 foo::Bar처럼 긴 이름을 만들게 되어 코드가 복잡해질 수 있습니다. 이를 완화하기 위해 짧은 미수식 이름(Bar)을 사용하는 것이 유용하며, 긴 네임스페이스를 별칭으로 정의하는 방법(namespace eu = example::v1::util)도 자주 사용됩니다.


문제

1. 별칭의 범위 문제

  • 별칭의 위치는 코드 유지 관리에 중요한 영향을 미칠 수 있습니다.

예를 들어:

using ::foo::Quz;

namespace example {
namespace util {

using ::foo::Bar;
  • Quz::example::util 안에서 사용 가능하지만, 헤더 파일이 새로 포함되거나 네임스페이스 충돌이 발생하면 문제가 생길 수 있습니다.
  • 별칭을 네임스페이스 내부에 배치하면 이러한 충돌 가능성을 줄일 수 있습니다.

2. 상대적인 이름 사용 문제

  • 예를 들어, using foo::Bar는 모호할 수 있습니다.
  • 현재 네임스페이스와 동일한 이름을 포함하거나, 다른 네임스페이스가 추가되면 이 선언이 깨질 수 있습니다.
  • 완전 수식된 이름(using ::foo::Bar)을 사용하면 이 문제를 방지할 수 있습니다.

익명 네임스페이스 사용하기

익명 네임스페이스에 별칭 선언을 배치하면, 다음과 같은 이점이 있습니다:

  1. 충돌 가능성이 줄어듭니다.
  2. 별칭 선언이 파일의 논리적 구성을 유지합니다.

예:

namespace example {
namespace util {

namespace {

// 모든 `using` 선언을 여기에 모읍니다.
using ::foo::Bar;
using ::foo::Quz;

}  // namespace

// 이제 이곳에서도 `Bar`와 `Quz`를 사용할 수 있습니다.

결론

  • 헤더 파일에는 절대 using 선언을 하지 마십시오.
  • 완전히 수식된 이름을 사용하는 것이 안전하며, 가능한 경우 익명 네임스페이스를 활용하십시오.
  • 이 가이드를 따르면 유지보수성과 코드 안전성이 높아질 것입니다.