boost의 tuple이나 shared_ptr와 같은 라이브러리를 정식 프로젝트에서 사용하려고 하면 고려해야 할 문제들이 있습니다. 그중의 하나가 바로 앞으로 컴파일러 벤더에서 제공하게 될 tr1 라이브러리와의 충돌 문제입니다.
boost namespace를 사용하여 코드를 작성해 왔는데 어느 날 컴파일러를 업그레이드하니 기본으로 tr1을 지원하고 있다면 컴파일러 벤더에서 지원하는 tr1 라이브러리를 포기하거나 코드상에서 boost를 찾아 전부 std::tr1으로 수정하고 #include 된 boost 관련 파일도 모두 tr1 헤더 파일로 수정해 주어야 합니다.
이런 문제를 어느 정도 해결할 수 있도록 나온 것이 boost.tr1 라이브러리입니다. 이 라이브러리는 그 자체로 무언가를 구현하고 있지는 않습니다. 단지 표준 헤더 파일과 boost 헤더 파일들의 관계와 namespace의 이름을 조정하여 마치 코드에서 표준 tr1 라이브러리를 사용하듯이 코딩할 수 있도록 해줍니다.
설명이 길었고 예제를 보겠습니다. 보통 boost 라이브러리를 사용하면 다음과 같이 boost 에서 제공하는 헤더 파일을 #include하고 boost namespace를 사용하게 됩니다.
#include <boost/shared_ptr.hpp> using namespace boost; int main() { shared_ptr<int> si(new int); }
하지만 boost.tr1 라이브러리를 사용하면 다음과 같이 코딩할 수 있게 됩니다.
#include <memory> using namespace std::tr1; int main() { shared_ptr<int> si(new int); }
사용법은 매우 간단합니다. INCLUDE_PATH의 제일 위쪽에 "boost_root/boost/tr1/tr1" 디렉토리를 넣고 다음으로 "boost_root" 디렉토리를 넣으면 끝입니다.
현재 이 라이브러리는 정식 릴리즈된 1.33.1 버전에는 포함되어 있지 않고 RC1.34.0에 들어 있습니다. boost의 cvs에서 받으시면 됩니다.
한가지 아쉬운 점은 boost에서 unordered_set, unordered_map의 구현을 제공하지 않기 때문에 이 라이브러리를 사용해도 tr1::unordered_set, tr1::unordered_map을 사용할 수 없다는 점입니다. 이외에 빠지는 것들로는 tr1에 포함된 수학 함수들이 있는데 저는 별로 사용할 일이 없을 것 같아서 이 점은 별로 문제가 되지 않네요.
앞으로 여기서 글을 쓸 때 사용할 코드들은 이 라이브러리를 사용하여 tr1 namespace를 사용할까 합니다.
댓글 없음:
댓글 쓰기