Trouble/C, C++,CMake

C++ 코드 작성 시 error : redifinition of TYPE 문제

침닦는수건 2023. 9. 26. 20:30
반응형

c++로 코드 작성하다가 뜬금없이 redifinition 문제를 겪을 때가 있다. 오류명 예시는 다음과 같다.

error: redefinition of 'template<class Archive> void boost::serialization::serialize(Archive&, boost::filesystem::path&, unsigned int)'

 

이 뜻은 redifinition에서 알 수 있듯이 정의가 2번 되었다는 것인데 보통 include 관계가 꼬여서 그렇다.

 

A.hpp <- B.hpp 과 같이 include한 관계일 때 A.hpp, B.hpp <- C.hpp 와 같이 새로운 C.hpp가 A, B 간 include가 이미 되어있는지 모르고 둘 다 include 시도할 때 발생한다.

 

A 입장에서는 B에서 찾을 때 한번, C에서 찾을 때 한번 총 2번 정의되기 때문이다. 

 

이 경우, A.hpp <- B.hpp <- C.hpp가 되도록 정리해야 해결된다. 하지만 프로젝트가 커질수록 꼬리에 꼬리를 무는 이러한 구조를 완벽히 할 수 없으므로 (사실 완벽히 하는게 코딩 잘하는거임) #ifdef, #endif 구문을 박아넣어주는 것도 좋다.

 

안전한 방법

#ifdef A_H
#define A_H

class A{
};

#endif

#ifdef A_HPP
#define A_HPP

class A{
};
#endif

위와 같이 ifdef TYPE_NAME_H/HPP 가 있는지 확인하고 이미 있다면 재정의를 건너뛰도록 처리해주는 것이다.

 

#pragma once를 박아넣어줘서 할 수도있지만 비표준이라고 들었다.

반응형