본문 바로가기
C

type redefinition 오류 해결법

by 상레알 2009. 2. 11.

 

C나 C++ 프로그램을 짜다보면 이런 저런 해더 파일을 인클루드 하게 되고 그러다보면 한번씩 'struct' type redefinition 이나 'class' type redefinition 어쩌구 하면서 에러가 발생할 때가 있다.
이런 경우 에러 내용 그대로 타입이 재정의 되었다는 얘기인데 이것은 일반적으로 아래 그림과 같은 경우에 발생한다.
사용자 삽입 이미지

그림에서 처럼 A.h 파일에 어떤 클래스나 타입을 정의해 놓았을 때 그 타입을 이용하기 위해 B.h 와 C.h에서 A.h를 인클루드하게 되고 D.c에서는 B.h와 C.h가 필요해서 둘을 인클루드하게 된다. 이런 경우 A.h 에서 정의한 타입을 D.c에서는 같은 내용을 두번 사용하게 되는 것이므로 이로 인해서 type redefinition이 발생하는 것이다.
C/C++프로그램을 어느정도 해봤다면 처음에는 누구나 type redefinition 이 발생 했을때 당혹스럽고 무엇 때문에 에러가 발생하는지 몰라서 헤매었던 기억이 한번씩은 있을것이다. type redefinition 같은 에러를 방지하기 위한 좋은 팁이 있는데 아래와 같이 A.h를 작성하는 것이다.
사용자 삽입 이미지
#ifndef 를 이용해서 A_H 라는 것이 디파인 되어 있는지 확인하고 디파인 되어 있지 않을 경우 아래에 A_H를 디파인한다. 그리고 필요한 코드를 작성하고 맨 마지막에 #endif를 이용해서 코드를 끝내는 것이다. 이렇게 해두면 위의 그림에서와 같이 B.h와 C.h를 같이 인클루드함으로써 발생하는 type redefinition을 원천적으로 방지하게 되는 것이다.


---- 조건부 컴파일에 대한것은 조건문 컴파일 글 참고---

'C' 카테고리의 다른 글

재지정( redirection) 이란  (0) 2010.11.23
포인터 개념  (0) 2010.06.11
공백포함 문자 입력  (0) 2009.05.07
구조체 포인터...  (0) 2009.04.07
파일 접근 모드  (0) 2009.03.31
라이브러리  (0) 2009.02.24
C 라이브러리 제작? 사용  (0) 2009.02.24
연산자 우선순위  (0) 2009.02.16
조건부 컴파일 #if #elif #else #endif  (0) 2009.02.11
LValue 와 RValue 차이점  (0) 2009.02.10