Visual Studio 버전 별 STL 지원

2008. 2. 28. 00:12개발

 

국내에는 아직도 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 지원 현황을 살펴봤습니다 :-)
 

 

  • 프로필사진
    2008.02.28 00:13

    비밀댓글입니다

  • 프로필사진
    BlogIcon 소금이2008.02.28 01:31

    2008하고 6.0하고 호환되지 않나요. 2003,2005와 6.0은 호환성이 약하지만 2008과는 호환성이 강하다고 들었는데.. 실제 그러한지 궁금하네요. ^^

    • 프로필사진
      BlogIcon esstory2008.02.28 07:55 신고

      2005 도 아니고 6.0 을 2008 로 컨버전하는데 쉽게 될리는 없을 것 같습니다. 그동안 경험으로 6.0 -> 2003, 2005로 컨버팅할 때 제법 오류가 많이 났었거든요.(WM 메시지가 변경된 것도 있고 일부 mfc 함수가 없어지거나 다른 함수로 대체된 것도 있습니다) 대부분 간단한 수정으로 해결 되는 것도 있었지만, 할일은 꽤 됐습니다. 또한 컴파일은 무사히 넘어가도 실제 런타임에 쉽게 죽는 경우를 많이 당했습니다. 6.0 에서 정상적으로 메모리 처리를 하지 않은 것들이 상위 버전 컴파일에서는 거의 바로 죽었거든요..
      쉽지는 않지만, 해볼만은 합니다 ^^;

  • 프로필사진
    BlogIcon 오스카2008.02.28 11:05

    tr1에서 정의하는 tuple의 최소 인수 개수는 10개 이상이어야 한다인데..., VS 2008 구현은 최소(...)만 지켰군요. ^^ 10개면 충분한 거 같지만;;;

    • 프로필사진
      BlogIcon esstory2008.02.28 11:26 신고

      Visual C++ Team Blog 에 올라온 글을 보니 up to ten items instead of just two 라고 적혀 있던데요 ^^;
      사실 10개면 왠만한건 구조체 선언안하고 쓸 수 있을 거 같아요. it->first, second, third ... 이런게 있어야 할래나요.. ^^;

    • 프로필사진
      BlogIcon 오스카2008.02.29 10:06

      기존의 pair가 2개만 사용했지만, 이젠 tuple을 통해 10개까진 사용할 수 있다는 의미인거 같습니다. 보니까, std::pair와의 호환성(?)을 위한 몇 가지 내용이 tuple에 포함되어 있더군요.

      tuple 에서의 접근은 get 함수 템플릿을 사용합니다.

      tuple<int, string, double> t(1, "tuple", 1.0f);
      cout << get<0>(t) << endl;
      cout << get<1>(t) << endl;
      cout << get<2>(t) << endl;

      최근에 본 거라서 기억이 맞을 듯.. ㅋㅋ

    • 프로필사진
      BlogIcon esstory2008.02.29 12:24 신고

      TR1 관련 꽤 유용한 것들이 많으 추가되었더라구요
      개발이 더 행복해 지겠네요
      정보 감사합니다 ~*

  • 프로필사진
    BlogIcon 체강2008.02.28 19:02

    유용한 정보 감사합니다^^
    학교에서 비주얼 스튜디오 2005가 느리다는 이유로 6.0으로 코딩하다 STL 디버깅 때문에 좌절했었는데..
    이제는 2005에서 코딩해야겠네요.

    • 프로필사진
      BlogIcon esstory2008.02.28 19:07 신고

      2008 이 3월 20일 정식버전으로 오픈한다고 합니다.
      기왕 사용하시려면 2008 을 사용하시는게 좋지 않을까요^^;

    • 프로필사진
      BlogIcon 오스카2008.02.29 09:58

      10여개 국가의 학생들에게 MS가 Visual Studio 2008 및 Windows Server 2003/SQL Server Developer 2008 등을 무상 배포하고 있습니다. 간단한 온라인 절차를 통해 가능하다고 하더군요.

      http://blogs.msdn.com/bkchung/archive/2008/02/20/microsoft-dreamspark.aspx

      아직 한국은 아니지만, 국제학생증으로도 가능하다고 합니다. 참고하시길...

    • 프로필사진
      BlogIcon esstory2008.02.29 10:00 신고

      친절한 오스카님 ^^; 감사합니다.

  • 프로필사진
    BlogIcon 뽐뿌맨2008.02.29 20:47

    사진찍는 프로그래머님, 좋은 글을 게재해 주셔서 감사 드립니다. synabreu@hotmail.com로 주소 보내어 주세요~ 약속대로 제가 선물을 드리고 싶습니다. 그리고 앞으로도 좋은 글 부탁 드립니다. 위에 STL이나 MFC가 왜 VC++ 6.0 에서 VC++ 2008로 마이그레이션 할 때 에러가 나는 지에 대해 글을 준비 중에 있습니다. :)

  • 프로필사진
    VC2008.11.14 18:34

    VC6.0 에서 STL 쓰실 땐 cpp 파일 상단에

    #pragma warning( disable : 4786 )

    한줄 넣고 시작하는게 좋습니다. 그리고 STL을 쓰는 소스의 경우 6.0 호환을 위해서도 그냥 미리 넣어주는 방법도 좋구요.

    • 프로필사진
      BlogIcon esstory2008.11.14 18:40 신고


      저희는 6.0 쓸 일이 이제 없어서요 2005나 2008 에서는 아무 문제 없습니다 ^^

  • 프로필사진
    BlogIcon 써니2009.04.10 14:23

    ㅎㅎ.. 잘 보고 갑니다. 혹시 STLPort 등 다른 라이브러리를 사용할 때 VC6에서 툴팁으로 내용을 표시하는 방법은 없는지 궁금합니다.

    • 프로필사진
      BlogIcon esstory2009.04.11 23:29 신고

      방문 감사합니다.
      요즘은 vc6 을 사용할 일이 없어 말씀하신 다른 라이브러리는 잘 모르겠네요.