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
   440   441   442   443   444   445   446   447   448   449   450