Page 445 - Do it! 자료구조와 함께 배우는 알고리즘(C 언어, 3쇄)
P. 445
보충수업 11-2 중복 헤더 정의 피하기
회원 프로그램의 헤더 Member.h(실습 11-1)와 체인 해시 프로그램의 헤더 ChainHash.h(실습 11-3)
의 대부분은 #ifndef 지시문과 #endif 지시문으로 둘러싸여 있습니다. 그 이유를 살펴보겠습니다.
일반적으로 헤더는 간단한 선언뿐만 아니라 정의도 포함할 수 있습니다. 이렇게 정의를 포함한 헤
더를 여러 번 include하면 컴파일할 때 ‘중복 정의’ 오류가 발생합니다. ‘같은 헤더를 두세 번이나
include하는 일은 나에게는 없을 거야~!’라고 생각할 수도 있지만 그렇지 않습니다. 예를 들어, 헤더
ChainHash.h 안에서는 Member.h를 include하고 있습니다. 또 체인 해시를 사용하는 실습 11-5
의 프로그램은 아래처럼 되어 있습니다.
#include "Member.h" /* "Member.h"를 직접 include */
#include "ChainHash.h" /* "ChainHash.h"를 통해 "Member.h"를 간접적으로 include */
이렇게 하면 헤더 Member.h는 두 번 include하게 됩니다. 따라서 같은 헤더를 여러 번 include하는
경우를 항상 대비해야 합니다. 이때 이용하는 방법이 include guard입니다. include guard의 일반
적인 형식은 아래 그림 11C-1과 같습니다.
include guard를 한 헤더
처음 include된 경우
#ifndef __HEADER __HEADER가 아직 정의되지 않았으므로
초록색으로 표시한 부분을 읽어 들입니다.
#define __HEADER 이때 __HEADER가 정의됩니다.
/* 선언과 정의 등 */ 두 번째로 include된 경우
__HEADER가 이미 정의되었습니다. 색칠한
#endif 부분을 건너뛰고 읽습니다.
[그림 11C-1] include guard를 이용한 헤더
위에 보이는 헤더가 처음 include될 때 매크로 __HEADER는 아직 정의되지 않았습니다. 그래서
#ifndef와 #endif로 둘러싸인 색칠한 부분을 읽어 들이고 매크로 __HEADER가 정의됩니다. 그러나
두 번째로 include되면 매크로 __HEADER는 이미 정의된 상태이므로 색칠한 부분을 건너뛰고 읽습
니다. 물론 매크로 이름인 __HEADER는 헤더마다 다르게 지정해야 합니다. 헤더 이름은 Member.h
에서는 ___Member이고 ChainHash.h에서는 ___ChainHash입니다.
11•해시 445