'헤더파일 include'에 해당되는 글 1건

  1. 2010.08.28 [C++] 헤더파일 include 할 때 min, max 매크로 문제
posted by cimple 2010. 8. 28. 04:35

프로그래밍을 하다 보면 황당한 경우를 만날 때가 있다. 그 중에 가장 당황스러울 때가, 헤더 파일들을 include 할 때, 특정 순서에 따라서 오류가 나고 안 나고가 결정될 때가 있을 때이다. 다시 말해서

#include <headerfileA.h>
#include <headerfileB.h>

이렇게 include 하면 문제가 없는데,

#include <headerfileB.h>
#include <headerfileA.h>


이렇게 include 하면 문제가 생기는 경우 말이다.

사실 이러한 경우가 발생하는 문제는 상당히 다양하다. 헤더 파일이 헤더 파일을 서로 서로 include 하는 좀 난잡한 구조로 코딩을 한다면 이런 문제가 발생할 가능성이 높다. 때문에 능력있는 프로그래머라면 각 헤더 파일이 의미하는 바와, 그 관계를 잘 설정해 놓고 코딩해야 할 것이다.

하지만 굉장히 난감한 경우도 있는데, 외부 라이브러리를 사용했을 때이다. 외부 라이브러리를 include 했는데 특정 순서에 따라서 컴파일이 되고 안 되고 한다면 정말 해결하기 어려운 노릇이다.

그 중에서 이번에 OpenMesh 를 활용한 Maya 프로그래밍을 하면서 겪었던 일.





#include <OpenMesh/Core/System/config.hh>
#include <OpenMesh/Core/IO/MeshIO.hh>
#include <OpenMesh/Core/Mesh/PolyMeshT.hh>
#include <OpenMesh/Core/Mesh/PolyMesh_ArrayKernelT.hh>
#include <OpenMesh/Core/Mesh/Traits.hh>
#include <OpenMesh/Core/Mesh/Attributes.hh>

#include <maya/MPxNode.h>
#include <maya/MTypeId.h>




Maya Node 를 만들 때 헤더 파일에 위와 같이 라이브러리 헤더 파일들을 include 했더니, 무수한 에러가 발생하였다.

그래서 OpenMesh 관련 헤더파일들을 cpp 파일에서 include 했더니, 에러는 사라졌다. 하지만, 노드 헤더 파일에서 노드 클래스를 구성할 때, OpenMesh 의 객체를 사용해야 하므로 무조건 노드 헤더파일 안에서 OpenMesh 관련 헤더파일들을 include 해야 하는 상황이었다.


빼도 박도 도망가도 못하는 상황이었는데 수백개씩 뜨는 에러메시지 중 다음과 같은 메시지가 눈에 띄었다.




1>c:\program files\openmesh-2.0-rc3\openmesh-2.0-rc3\src\openmesh\core\geometry\vectort_inc.hh(430) : warning C4003: 'max' 매크로의 실제 매개 변수가 부족합니다.
1>c:\program files\openmesh-2.0-rc3\openmesh-2.0-rc3\src\openmesh\core\geometry\vectort_inc.hh(438) : warning C4003: 'min' 매크로의 실제 매개 변수가 부족합니다.
1>c:\program files\openmesh-2.0-rc3\openmesh-2.0-rc3\src\openmesh\core\geometry\vectort_inc.hh(469) : warning C4003: 'min' 매크로의 실제 매개 변수가 부족합니다.
1>c:\program files\openmesh-2.0-rc3\openmesh-2.0-rc3\src\openmesh\core\geometry\vectort_inc.hh(474) : warning C4003: 'max' 매크로의 실제 매개 변수가 부족합니다.
.
.
.


무언가 min, max 를 OpenMesh 에서 사용하는데, 이것이 충돌을 일으키는 것 같았다. 그래서 구글을 좀 뒤져서, 다음과 같은 좋은 정보들을 찾았다.


include 순서 오류에 대한 질문/답변글

min/max 매크로로 인한 오류 해결 방법


즉, Miscrosoft 가 min, max 같은 단어들을 '매크로' 로 등록해 둔 것이 문제라는 것이다. 사실 짧은 프로그래밍 경력과 실력으로 그 의미와 문제점을 명확히 알아듣기가 어렵다.

해결책은 위의 링크에도 소개되었듯이 다음과 같이 헤더파일 상단에 삽입하면 된다.



#define NOMINMAX
#ifdef max
 #undef max
#endif
#ifdef min
 #undef min
#endif




...하나 하나 알아가는게 쉽지만은 않다.


ThEnd.