본문 바로가기
컴퓨터

[C언어] #ifndef~ #endif

by Luyin 2012. 7. 29.

♠ 구조체 중복 정의로 인해 발생하는 오류 

  

☞ 일단 main.c에서 point.h를 포함한다. 그리고 pointOperation.h를 포함하는데, pointOperation.h가 

 

point.h를 포함하므로 결과적으로 main.c는 point.h를 두 번 포함하는 셈이 된다.

 

전처리기는 이를 문제삼지 않는다. 전처리기는 #include 문의 명령대로 main.c에 구조체 point의 정의를

 

두 번 포함시킬 뿐이다. 문제는 컴파일러가 일으킨다. 컴파일러는 point 구조체의 정의가 두 번 등장했음 을 

 

인식하고 에러메시지를 발생시킨다. 

 

♠ 중복 정의를 피하기 위한 매크로 #ifndef ~ #endif 

  

 

☞ ifndef는 "If not defined"의 약자로서 "~을 정의(define)하지 않았다면" 이라는 뜻이다.

 

즉, __POINT_H__를  #define 문장으로 정의하지 않았다면 아래에 등장하는 #endif 문장 이전의 내용들을

 

include 영역에 포함시키라는 뜻이다. 

 

 #include <point.h> 처리

 __POINT_H__라는 매크로를 정의한 적이 없으므로, #ifndef ~ #endif 사이에 있는 모든 내용을 main.c에 포함시킨다.

 

② #include <pointOperation.h> 처리

두 번째 #include문 처리 과정에서 point.h의 첫 번째 문장 #ifndef __POINT_H__을 만나면 매크로 __POINT_H__는

 

앞서 정의했으므로 #endif 이전까지의 내용을 main.c에 포함시키지 않는다. 결국 두 번째 #include 문에 의해서

 

main.c에 구조체의 정의는 추가로 포함되지 않는다. 

 

  모든 헤더파일에 매크로 #ifndef ~ #endif 의 선언을 포함하는 것이 좋다."

 

헤더파일 중복으로 발생할 수 있는 문제를 막는 최고의 방법은 매크로 #ifndef ~ #endif을 이용하는 것이다. 



[출처 : http://blog.naver.com/clown7942?Redirect=Log&logNo=110123052710]