각 헤더 파일이 자체적으로 완성도가 있게끔 작성하라.
헤더의 내용과 관련이 있는 다른 헤더는 첨가시켜 주어야 한다. 만약 어떤 헤더 파일이 다른 헤더 파일을 포함시켜야만 작동할 수 있도록 만들어진다면 그만큼 그 헤더 파일의 완성도는 떨어지게 되고, 그 헤더 파일의 사용자는 활용에 어려움을 겪게 될 것이다. 헤더는 스스로 충분히 자급자족할 수 있는 형태로 완성도 있게 만들어야 한다는 것이다. 즉, 빌드 내에서 각 헤더는 분리시켜 컴파일하고, 각각 오류나 경고가 없게 만들어야 한다.
<예> 템플릿과 연결되었을 때의 미묘한 이슈들을 짚고 넘어가자.
예 1 : 의존 이름.
템플릿은 정의되는 시점에 컴파일되는 것이 일반적이지만, 의존 이름이나 타입이 아직 그 시점까지 컴파일되지 않았을 경우는 예외이다. template<class T> class widget과 a std::deque<T> 멤버는 <deque>가 첨가되어 있지 않다고 해도 widget의 인스턴스가 만들어지기 전까지는 컴파일 오류를 발생시키지 않지만, widget의 인스턴스가 만들어지기 위해서는 헤더에 분명히 #include <deque>가 있어야 한다.
예 2 : 멤버 함수 템플릿 및 템플릿의 멤버 함수는 사용될 때에만 인스턴스가 만들어져야 한다.
widget은 std::deque<T> 타입의 멤버가 없지만, widget의 멤버 함수 중 하나인 Transmogrify가 deque를 사용한다면 어떨까? Transmogrify를 사용하지 않는 호출자는 <deque>를 첨가하지 않고도 widget의 인스턴스를 만들고 사용할 수 있겠지만, 표준적으로 widget 헤더에는 #include <deque>가 있어야 한다. 어떤 호출자가 <deque>를 필요로 할지 모르기 때문이다.
'소프트웨어 공부 > 프로그래밍' 카테고리의 다른 글
표준적인 형식의 산술 및 할당 연산자를 사용하라 (0) | 2021.04.20 |
---|---|
값, (스마트) 포인터, 참조 중 적절한 방식으로 인자를 얻어라 (0) | 2021.04.20 |
정의의 의존성과 순환 의존성을 최소화하라 (0) | 2021.04.20 |
너무 긴 함수와 많은 중첩 구조는 피하라 (0) | 2021.04.20 |
변수는 항상 초기화하여 사용하라. (0) | 2021.04.20 |