2015년 5월 21일 목요일

c언어 헤더파일(header file) 생성 시 중복 포함을 방지 기법

C언어에서 많이 발생하는 실수 중 하나가 헤더파일을 중복으로 포함시키는 것이다.


1
2
3
4
// test.h
#include "hello.h"
 
...
cs
1
2
3
4
// test2.h
#include "hello.h"
 
...
cs


1
2
3
4
5
// main.cpp
#include "test.h"
#include "test2.h"
 
...
cs


위 코드를 보라
main.cpp에서는 test.h 와 test2.h 두 헤더를 추가하고 있다.
사용자 입장에서는 전혀 문제가 없어 보이지만 실제로 test.h 와 test2.h는 각각 동일한 헤더인
hello.h를 포함하고 있다.


이런 경우를 방지하기 위해 헤더를 만들 때 아래와 같이 선언해 주는것을 권장한다.


1
2
3
4
5
6
7
8
 
#ifndef __HELLO_H__
#define __HELLO_H__
 
...
 
#endif
 
cs


위 코드와 같이 선언해 주고 ... 부분에 헤더에 들어갈 코드를 입력하면 된다.
코드를 해석하면 먼저 ifndef 를 통해 __HELLO_H__ 가 선언되어 있는지 확인한다.
만약에 선언되어있지 않다면 아래 부분을 실행하고, 선언되어 있다면 endif부분 까지 건너뛴다.


만약 이 헤더를 중복정의 한다면, 먼저 정의된 헤더 부분에서 __HELLO_H__를 #define을 통해 선언했으므로 두번째 선언되는 헤더에서는 ifndef에 걸려 동일한 헤더가 실행되지 않게된다.


C라이브러리의 헤더를 보면 거의 모든 헤더가 위와 같은 구조로 시작하는것을 확인할 수 있다.
물론 필자도 헤더파일을 선언할 때 위 코드를 습관처럼 먼저 쓰고 시작한다. 저런 헤더파일을 작성할 때 무조건 써주는 습관을 들이면 상당히 좋다.



댓글 1개: