[C++] Header guard (헤더 가드)
C++로 프로그램을 짜다보면 코드를 분리하기 위해 헤더 파일을 통해 이를 행해주는데, 헤더파일에는 헤더 가드라는 구문이 존재한다.
왠만한 IDE에서 헤더파일을 생성하면 이 구문은 자동으로 생성된다.
소스파일이 많아지거나 포함 관계가 복잡해지면 동일한 헤더파일을 중복으로 include 하는 상황이 온다. 이때 헤더 가드는 같은 헤더 파일을 두번 이상 포함하는 상황을 방지하는 역할을 해준다.
좀 더 자세히 살펴보기 위해 예시를 들것인데, 헤더 가드 없는 헤더 파일을 만들어보겠다.
먼저 분리할 전체 코드이다.
좀 더 깔끔한 코드를 위해 add.h 헤더와 printAddResult.h 헤더를 만들어 메인함수와 분리시키겠다.
ctrl + n 을 누르고 헤더파일을 만들자마자 보면 위와같이 코드 몇줄이 써져있는데, 바로 헤더가드 구문이다. 일단 지금은 쓰지 않을테니 지우고 넘어가자.
헤더 가드문을 지우고 만든 add.h와 printAddResult.h 헤더파일 그리고 main.cpp 파일이다.
이제 실행시켜보자.
바로 에러가 뜬다.
에러문을 읽어보면 Redefinition of 'add' 라고 add 함수가 두번 정의되었다는 내용이다.
이러한 에러가 발생하는 이유는 #include 키워드를 통해 헤더를 포함시킨다는 것은 해당 헤더파일의 코드를 통째로 가져온다는 것을 의미한다.
#include "add.h" 를 통해 add 헤더를 포함시킨다는것은 해당 헤더에 있는 코드 전부를 포함시키려는 파일에 그대로 가져다 적겠다는 의미이다. 따라서 위의 main.cpp는 아래와 같은 코드와 동일한 의미를 가지게 된다.
이러한 실수는 헤더가드를 통해 방지해줄 수 있다.
헤더가드는 만약 add 헤더가 정의되어있지 않다면, (가져다 쓰려는 코드에) add 헤더를 정의한다. 를 의미한다.
이제 헤더 가드를 넣고 다시 실행시켜보자.
에러가 뜨지 않은것을 확인할 수 있다.