♠ 구조체 중복 정의로 인해 발생하는 오류
☞ 일단 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]
[출처] [♠ C언어 ♠] #ifndef ~ #endif|작성자 kaka
'컴퓨터' 카테고리의 다른 글
[C언어] 표준 입력 함수( getchar() , getche(), getch(), gets(), scanf() ) (0) | 2012.08.01 |
---|---|
[알고리즘] 알고리즘 성능 (0) | 2012.07.29 |
[MySQL] Command Line 으로 원격지에서 MySQL 접속하기 (0) | 2012.07.23 |
[JSP][Apach Tomcat][Eclipse] Eclipse 설치 및 Tomcat 연동 - 이클립스 톰캣 연동 (0) | 2012.07.18 |
[Eclipse][Web] Eclipse 를 이용한 HTML5 웹 개발환경 세팅 (0) | 2012.07.18 |