본문 바로가기
개발

Visual Studio 버전 별 STL 지원

by esstory 2008. 2. 28.

 

국내에는 아직도 Visual Studio 6.0으로 개발 및 운영되는 프로젝트가 상당히 많은 편입니다. (MFC 어플리케이션 분야에서)
주위를 둘러봐도 Visual Studio 2005 는 고사하고 2003 버전으로 개발된 프로젝트도 드문 편이더군요.

컴파일러가 변경되면서 이전보다 훨씬 나은 성능과 훌륭한 UI 를 제공했다면 대부분의 사람들이 이미 새로운 버전으로 넘어왔을 텐데 제가 생각해도 마이크로소프트가 C++ MFC 지원에 그간 참으로 무심했던 것 같습니다.  사실 컴파일러의 버전업이 닷넷이나, C# 을 위한 버전업이었고 이전부터 MFC 는 죽었다라는 얘기는 계속 전해져 왔으니 어느정도는 사실처럼 고착화 된 것 같습니다.

Visual Studio 2008 도 나오고 해서 Visual Studio 6.0을 버리게 된 계기가 되었던 STL 지원관련 아주 간단한 변천 내용을 살펴 봤습니다.
다행히 제 PC 에 Visual Studio 6.0 에서 부터 2008 까지 4가지 버전의 Visual Studio 가 설치되어 간단하게 비교해 볼 수 있었습니다.

 

1.     vector 지원

 

vector 관련 코드는 다음과 같이 아주 초보적인 내용으로 테스트 했습니다.


vector<string> data;

 

data.push_back("abc");

data.push_back("234");

data.push_back("가나다라");


Visual Studio 6.0

 

3줄을 넣고 컴파일을 돌리면 바로 무지막지한 경과가 뜹니다. 이 경고를 보지 않으려면 #pragma warning 을 사용하던가 STL 을 사용하지 않는 편이 정신건강에 좋습니다.


D:\work\test\MainFrm.cpp(83) : warning C4786: 'std::reverse_iterator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const *,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::basic_string<char,std::char_t

raits<char>,std::allocator<char> > const &,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const *,int>' : identifier was truncated to '255' characters in the debug information

D:\work\test\MainFrm.cpp(83) : warning C4786: 'std::reverse_iterator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > *,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::basic_string<char,std::char_traits<

char>,std::allocator<char> > &,std::basic_string<char,std::char_traits<char>,std::allocator<char> > *,int>' : identifier was truncated to '255' characters in the debug information


그나마 에러가 아닌 경고여서 일단 컴파일은 됩니다. 하지만 디버그를 통해 vector 에 들어 있는 값을 확인하고자 할 때 다시 한번 좌절하게 됩니다.

 

사용자 삽입 이미지

 

툴팁으로 아무런 정보가 제공되지 않을 뿐만 아니라, Quick Watch 창에서도 vector 에 들어 있는 내용을 전혀 볼 수가 없습니다.

 

Visual Studio 2003

 

Visual Studio 2003 이 나오면서 STL 에 대한 그나마 제대로 컴파일이 되기 시작했습니다. 하지만 MFC CArray 계열과 같이 완벽한 디버깅 지원은 2003 에서도 제대로 지원되지 않았습니다. 디버그상태에서 vector 의 내용보기는 여전히 암호 해석과도 같은 복잡한 작업을 거쳐야 합니다.

 

사용자 삽입 이미지


Visual Studio 2005

 

STL 에 대해서는 상당한 발전을 이뤘습니다. 디버깅 시 Quick Watch 도움 없이 툴팁만으로도 vector 배열에 들어 있는 모든 변수의 값을 확인할 수 있습니다.

 

사용자 삽입 이미지

Visual Studio 2008

 

2005에서 특별히 달라진 점을 발견하지 못했습니다. 툴팁 부분은 2005와 동일합니다.

 

사용자 삽입 이미지

 

 

2.     map 지원하기


키와 값을 쌍으로 지원하는 map 에 대해서도 아래의 간단한 코드를 이용해 테스트 해 봤습니다.


map<string, string> mapData;

 

mapData.insert(make_pair("123", "숫자"));

mapData.insert(make_pair("가나다", "한글"));


Visual Studio 6.0

 

3줄을 넣고 6.0 에서 컴파일 하면 오류 2개 발생하고 경고가 27개 발생합니다.  오류를 피해가기 위해서는 아래와 같이 코드를 조금 수정하면 되는데요 그래도 경고가 118 개나 나기 때문에 6.0 에서 STL 을 사용하는 사람이 있다면 정신건강을 위해 도시락 싸 들고 따라다니면서 말리고 싶습니다.

 

map<string, string> mapData;

//mapData.insert(make_pair("123", "숫자"));

//mapData.insert(make_pair("가나다", "한글"));

mapData.insert(make_pair(string("123"), string("숫자")));

mapData.insert(make_pair(string("가나다"), string("한글")));


Visual Studio 2003

 

6.0과는 달리 컴파일에는 전혀 문제가 없습니다.  디버그 지원관련해서 툴팁으로 map 의 내용을 쉽게 확인하는 방법은 지원되지 않습니다. vector 에서와 마찬가지로 Quick Watch 에서도 제대로 된 정보를 볼 수 없기 때문에 디버깅이 사실상 힘듭니다.

 

사용자 삽입 이미지


Visual Studio 2005


vector
와 마찬가지로 2005 버전에서부터는 제대로 된 디버깅을 지원하기 때문에 마우스 커서를 변수에 가져가면 마치 배열처럼 간단하게 map 에 들어 있는 모든 내용을 쉽게 접근할 수 있습니다.

 

사용자 삽입 이미지


Visual Studio 2008

 

2008 에서도 2005 와 동일한 툴팁을 제공하고 있습니다.

 

사용자 삽입 이미지

 

기본적인 vector map 이외에도 Visual Studio 6.0 Visual Studio 2003 버전에서는 상당부분 STL 지원에 미흡한 부분이 많았습니다.  특히 Visual Studio 6.0 STL 뿐만 아니라 ATL 에서도 온갖 버그를 내장하고 있어서 이러한 기능들을 이용해 프로젝트를 수행하기에는 어려움이 많았습니다.  그럼에도 불구하고 아직도 저와 같은 업계의 대부분 프로젝트가 Visual Studio 6.0 으로 개발되고 유지보수 되고 있다는게 참 신기합니다. 해당 프로젝트에서는 불편을 감수하고 사용하는 것인지, 아예 STL 을 사용하지 않고 MFC 에서 제공하는 CPtrArray 와 같은 이전 방식대로 개발진행 중인지 늘 궁금합니다.
 

STL 을 사용함에 있어 제가 알고 있는 컨테이너와 알고리듬 상에서는 Visual Studio 2005 Visual Studio 2008 버전은 큰 차이가 없어 보였습니다.(실제 제가 사용하는 컨테이너도 몇개 안되어서 STL 지원에 대한 정확한 분석은 처음부터 기대하지 마세요^^)
생각해 보니 Visual Studio 2005 에서 STL 지원과 관련된 문제에 봉착한 적이 없었던 것 같네요. (한번 문제가 있었긴 했는데, A DLL 에서 생성한 컨테이너를 B DLL 로 전달할 때 정상적으로 데이터가 전달되지 않는 문제가 있었습니다. 해당 문제는 STL 문제라기 보다 서로 다른 Thread 모델을 가진 DLL 사이의  메모리 관리에 관한 마이크로소프트의 설계와 연결된 문제여서 할 수 없이 다른 방법으로 회피하는 방법을 사용했었습니다)

 

Visual Studio 2008 에서는 TR1 에 포함된 새로운 컨테이너(크기가 고정된 Array 와 같은 컨테이너)와 최대 10개까지 항목을 하나로 묶을 수 있는 pair 와 비슷한 tuple 등이 추가된다고 합니다.
아직 정식버전으로 출시되지 않아서 써보진 못했습니다만 추후 기회가 된다면 추가된 기능에 대해서도 별도로 포스팅해 보고 싶네요.

이상으로 간단하게 Visual Studio 버전별 STL 지원 현황을 살펴봤습니다 :-)
 

 

댓글