구조체 중복 정의로 인해 발생하는 오류
☞ 일단 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을 이용하는 것이다.
♠ 참조: C 프로그래밍 파워 업그레이드 - 오렌지미디어(윤성우 저) [출처] [♠ C언어 ♠] #ifndef ~ #endif|작성자 kaka |
'잡동사니' 카테고리의 다른 글
8비트 MCU 또는 32비트 MCU 선택 기준 (0) | 2019.10.09 |
---|---|
구조체와 const에 관하여 (0) | 2019.07.18 |
정수를 문자열로 변환하기 (0) | 2019.06.27 |
메모리 영역(code, data, stack, heap) (0) | 2019.06.20 |
MY PC에서 ROS MASTER를 통해 ethernet 연결된 Device로 접근하는 법 (0) | 2019.05.03 |