태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

달력

06

« 2017/06 »

  •  
  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  •  

MFC에서 GDI+를 사용하다보면 소스에 자동으로 추가되는 DEBUG_NEW 때문에 귀찮아 지죠. operator newdelete 를 재정의해버려서 컴파일이 안된다거나 실행 중 메모리 오류를 발생시키거든요.

그렇다고 DEBUG_NEW 를 아예 꺼버리기도 굉장히 찜찜하죠. 메모리 관련된 오류를 잡아주는 가장 기본적인 장치니까요. 그래서 GDI+ 개체를 생성하고 지울 때는 좀 번거롭지만 ::new, ::delete 같이 일일이 재정의되지 않은 버전으로 사용하기도 하는데, 그것도 Bitmap::FromHBITMAP 메소드 같이 내부에서 포인터를 생성해서 리턴하는 메소드를 사용할 때는 해결책이 되지 않습니다. GDI+ Bitmap 의 경우에는 FromHBITMAP 메소드와 동일한 역할을 하는 생성자가 있어서 그나마 다행이긴 합니다만 일일이 신경쓰는 것도 귀찮은 일인 것은 분명합니다.

이번 기회에 잠깐 검색을 해보니 이미 유명한 문제인지 MS의 support 사이트에 해결책이 올라와있네요. ( PRB : MFC DEBUG_NEW does not work with GDI+ )

좋습니다. 그런데 MS에서 제공하는 헤더를 집어넣으니 이제는 C4100 unreferenced formal parameter 경고가 왕창 뜹니다. 모든 문제가 한 방에 깔끔하게 해결되지는 않는군요.

#pragma warning 으로 꺼버릴 수도 있는데, 실제로 문제가 되는 상황에서 경고가 안나오는 것도 문제니까 헤더에서 4100 경고를 꺼버리고 싶지는 않습니다. #pragma warning push / pop 으로 감싸주는 것도 방법이긴 하지만 이렇게 거창한 방법까지 써야하나... 역시 검색을 해보았습니다.

검색을 해보니 역시 이 상황에 맞는 해결책이 있네요. 바로 UNREFERENCED_PARAMETER() 매크로였습니다. 무려 WinNT.h 에 정의되어 있는 녀석이군요. DBG_UNREFERENCED_LOCAL_VARIABLE() 같은 친구들도 있네요.

MS에서 제공해준 Gdiplus.h 대용 헤더 파일에 UNREFERENCED_PARAMETER() 매크로를 적용하는 걸로 모든 문제가 해결되었습니다.

신고
TAG c++, Gdiplus
Posted by wafe

댓글을 달아 주세요

오랜만에 C++ 코드를 작성하고 있습니다. C#으로 WPF/Silverlight 만 다루다가 오랜만에 C++로 ATL/COM을 만지려고 하니 사소한 것에서 난관이 많네요. 툴도 바뀌기도 했고 말이죠. 오랜만에 C++을 쓰다보니 새로 알게 되는 지식도 생기는군요.

Visual C++ 2010 에서는 STL 컨테이너에 대해서 for each, in 구문을 사용할 수 있다는 걸 알게되었습니다. (MSDN 문서 항목을 보면 2005 버전부터 존재하긴 합니다.)

도입된 목적은 역시 C++/CLI 에서 IEnumerable 등의 형식을 순차적으로 처리할 때 C#의 foreach, in 구문과 동일하게 쓰기 위한 것으로 보입니다. 하지만 C++/CLI가 아닌 win32 프로그래밍에서 STL 컨테이너에 대해서도 사용할 수 있는 것이지요.

Visual C++ 2010 에서는 c++0x 표준안의 일부가 이미 포함되어 있기에 아래와 같이 별로 C++ 스럽지 않은 코드가 나오게 됩니다. (c++0x는 이제 ISO C++ 표준으로 승인이 되어 C++11 이라고 부르는 것이 정식입니다.)

	
        std::<CString, CString> _uriMap;
        std::list<CString>&& candidates = GetUriMappingCandidates(uri); // r-value reference
	CString foundKey;
	CString foundValue;
	for each (auto c in candidates)
	{
		auto it = _uriMap.find(c);
		if (it != _uriMap.end()) 
		{
			foundKey = it->first;
			foundValue = it->second;
			break;
		}
	}

C++11의 auto 키워드와, 비록 비표준 키워드이긴 하지만 for each 를 써주니까 STL 컨테이너를 두 가지나 사용하고 있는데도 예전처럼 콜론과 부등호가 난무하지 않고 코드가 깔끔해보여서 좋네요.

신고
Posted by wafe

댓글을 달아 주세요

이전까지의 Visual Studio에서는 ATL Simple Object(ATL 단순 개체)를 만들 때 약식 이름을 넣어주면 모든 필드가 채워졌지만 Visual Studio 2010에서는 그렇지가 않아서 좀 당황스럽네요. 앞으로는 ProgID를 빠뜨리지 않게 신경써야 되겠습니다.


Visual Studio 2010에서는 보안상의 이유로 ProgID 를 자동으로 채워주지 않도록 했다고 하는데, 정확히 어떤 보안상의 이유인지는 저도 아직 파악을 못했고, 이러한 변화를 언급하고 있는 웹 페이지를 두 개 정도 찾았을 뿐입니다.

신고
Posted by wafe

댓글을 달아 주세요

2009.05.23 03:36

Google Test의 데이터 기반 테스트 분류없음2009.05.23 03:36

Google Test에서도 MBUnit의 RowTestNUnit의 TestCase 같은 데이터 기반 테스트라는 개념을 지원한다. Google Test에서는 이 개념을 Value-Parameterized Tests라고 부른다. 코드는 동일한데 사용하는 데이터 값 몇 개만 바뀌는 테스트 케이스가 있을 때, 코드 중복을 없애주면서도 어떤 테스트 케이스가 실패하고 성공하는지 정확하게 알려주는 유용한 기능이다.

 

그런데 아무래도 C# 보다는 유연성이 떨어지는(?) C++이라 쓰기가 마냥 쉽지만은 않아서 좀 정리를 해 둘 필요가 있다. 템플릿을 써서 구현한 기능이라 컴파일 에러라도 한 번 나면 좀 골치가 아프긴 하지만, Visual C++ 2008의 템플릿 관련 에러 메시지는 엄청나게 친절하기 때문에 미리 걱정할 필요는 없을 듯.

  1. #include "gtest/gtest.h"

    #include "gmock/gmock.h"

    #include <tuple>

     

    using testing::Return;

     

    namespace

    {

    // ParamType 구성

    // TestWithParam<T>가 받는 테스트 데이터는 T 타입의 값 하나이기 때문에, 데이터 여러 개를 넘기려고 tuple을 사용한다.

    typedef std::tr1::tuple<bool, MsoTriState, MsoAnimateByLevel, MsoTriState, MsoTriState, MsoAnimateByLevel> ParamType;

     

    // Value-Parameterized Tests를 위해서는 비어있는 Fixture라도 하나 만들어야한다.

    // TestWithParam<T>를 상속받는 것 외에는 일반적인 Test Fixture와 동일하다.

    class TestEffectDataSetEffectInformationFixture

        : public testing::TestWithParam<ParamType>

    {

    };

     

    // Value-Parameterized Tests를 위한 테스트 메서드

    // 여기서는 TEST_P 매크로를 쓴다. 일반적인 Fixture를 쓸 때에는 TEST_F 매크로를 쓰는 것과 다르다.

    TEST_P(TestEffectDataSetEffectInformationFixture, TestSetEffectInformation)

    {

        bool recheckRun;

        MsoTriState recheckRetValue;

        MsoAnimateByLevel levelEffectRetValue;

        MsoTriState animBgRetValue;

        MsoTriState animBgExpected;

        MsoAnimateByLevel levelEffectExpected;

     

        // GetParam() 함수를 써서 테스트 데이터를 얻는다.

        // 여기서는 데이터가 tuple 이라서 tie()를 써서 값을 얻는다.

        std::tr1::tie(recheckRun, recheckRetValue, levelEffectRetValue, animBgRetValue, animBgExpected, levelEffectExpected) = GetParam();

     

        MockEffectAdaptor ea;

        MockEffectInformationAdaptor eia;

     

        if (recheckRun) {

            EXPECT_CALL(ea, GetAnimateBackgroundRechecked())

                .WillOnce(Return(recheckRetValue));

        }

        else {

            EXPECT_CALL(ea, GetAnimateBackgroundRechecked())

                .Times(0);

        }

     

        EXPECT_CALL(eia, GetBuildByLevelEffect())

            .WillOnce(Return(levelEffectRetValue));

        EXPECT_CALL(eia, GetAnimateBackground())

            .WillOnce(Return(animBgRetValue));

     

        EffectData ed;

        ed.SetEffectInformation(ea, eia);

     

        ASSERT_EQ(animBgExpected, ed.AnimateBackground);

        ASSERT_EQ(levelEffectExpected, ed.BuildByLevelEffect);

    }

     

    // Value-Parameterized Tests에 테스트 데이터를 제공

    INSTANTIATE_TEST_CASE_P(Prefix, TestEffectDataSetEffectInformationFixture,

        testing::Values(

            ParamType(true, msoTrue, msoAnimateLevelNone, msoFalse, msoTrue, msoAnimateLevelNone),

            ParamType(true, msoFalse, msoAnimateLevelNone, msoFalse, msoFalse, msoAnimateLevelNone),

            ParamType(false, msoFalse, msoAnimateTextByAllLevels, msoFalse, msoFalse, msoAnimateTextByAllLevels),

            ParamType(false, msoFalse, msoAnimateLevelNone, msoTrue, msoTrue, msoAnimateLevelNone)

        ));

    } // anonymous namespace

 

테스트 실행 결과는 이런 식으로 나온다.

3>[ RUN      ] Prefix/TestEffectDataSetEffectInformationFixture.TestSetEffectInformation/0
3>[       OK ] Prefix/TestEffectDataSetEffectInformationFixture.TestSetEffectInformation/0
3>[ RUN      ] Prefix/TestEffectDataSetEffectInformationFixture.TestSetEffectInformation/1
3>[       OK ] Prefix/TestEffectDataSetEffectInformationFixture.TestSetEffectInformation/1
3>[ RUN      ] Prefix/TestEffectDataSetEffectInformationFixture.TestSetEffectInformation/2
3>[       OK ] Prefix/TestEffectDataSetEffectInformationFixture.TestSetEffectInformation/2
3>[ RUN      ] Prefix/TestEffectDataSetEffectInformationFixture.TestSetEffectInformation/3
3>[       OK ] Prefix/TestEffectDataSetEffectInformationFixture.TestSetEffectInformation/3

 

이 예제 코드에서는 테스트 데이터를 만들 때 그냥 Values()만 썼는데, Combine() 같은 걸 쓰면 주어진 값의 모든 조합을 생성해서 테스트해 준다거나 하는 기능은 그냥 코드 중복을 막는다는 차원을 넘어서는 멋진 기능이라고 생각된다.

 

그 외에 다른 사용법은 공식 문서를 보면 되는데, 실제 사용하면서 생기는 궁금증을 해결하기 위해서는 소스 코드에 주석 형태로 들어있는 사용 예제들을 보는게 좋다.

이 글은 스프링노트에서 작성되었습니다.

신고
Posted by wafe

댓글을 달아 주세요

2009.04.23 23:00

shared_ptr의 custom deleter 사용법 분류없음2009.04.23 23:00

내가 처음 custom deleter를 봤을 때에는, shared_ptr 생성자에서 한 번 custom deleter를 지정해주면 그 다음부터 reset()을 하더라도 항상 처음에 지정했던 deleter를 불러줄 거라는 기대가 있었다. 그래서 테스트를 해봤더니 그런게 아니네. custom deleter를 유지하고 싶다면 reset()을 할 때 deleter도 같이 넘겨줘야 한다.

 

아래 테스트 코드는 custom deleter를 지정하지 않고 reset()한 경우에는 custom deleter가 호출되지 않는다는 걸 Google Test를 이용해서 보여주는 코드이다.

 

  1. class TestSharedPtrFixture : public testing::Test
    {
    public:
       std::stringstream ss;

       TestSharedPtrFixture()
           : ss(std::stringstream::out | std::stringstream::out)
       {
       }

       void Deleter(int* p)
       {
           ss << "dtor()" << std::endl;
           delete p;
       }
    };

    // shared_ptr 기능을 제대로 알기 위한 테스트
    // shared_ptr reset() 메서드에서 dtor를 별도로 지정하는 경우 reset() 메서드를 실행할 때마다 dtor를 지정해줘야 함
    TEST_F(TestSharedPtrFixture, TestReset)
    {
       ss.str("");

       std::tr1::shared_ptr<int> sp;
       ASSERT_EQ(NULL, sp.get());

       sp.reset(new int(9), std::bind1st(std::mem_fun1(&TestSharedPtrFixture::Deleter), this));
       sp.reset(new int(8));
       sp.reset();

       ASSERT_EQ("dtor()\n", ss.str());
    }

    // shared_ptr 생성자에서 dtor를 별도로 지정하는 경우 reset() 메서드를 실행할 때마다 dtor를 지정해줘야 함
    TEST_F(TestSharedPtrFixture, TestCtor)
    {
       ss.str("");

       std::tr1::shared_ptr<int> sp(new int(9), std::bind1st(std::mem_fun1(&TestSharedPtrFixture::Deleter), this));
       ASSERT_EQ(9, *sp.get());

       sp.reset(new int(8));
       sp.reset();

       ASSERT_EQ("dtor()\n", ss.str());
    }

 

이 글은 스프링노트에서 작성되었습니다.

신고
Posted by wafe

댓글을 달아 주세요

2009.04.18 03:15

Google Test & Visual Studio 2008 분류없음2009.04.18 03:15

  1. google test를 다운받는다.(gtest-1.3.0)
  2. 필요한 폴더만 남기고 나머지는 다 지운다. 실제 프로젝트에서 쓸 때에는 include, msvc, src 폴더 외에는 필요없다.
  3. msvc 폴더의 파일 중에도, 프로젝트에서 쓸 때에는 gtest.vcproj 파일 외에는 다 필요 없으므로 지워버린다.
  4. VS2008로 gtest.vcproj 파일을 열어서 2008 포맷으로 변환해준 후 VS를 닫는다. (닫을 때 sln을 저장할 것인지 물어보는데 저장하지 않음을 선택한다.)
  5. 프로젝트를 만든다.
  6. 솔루션 폴더에 gtest-1.3.0 폴더를 통채로 옮긴다.
    1. 여러 사람이 같이 작업하는 프로젝트에서 구글 테스트 프레임워크를 쓰기에는, 솔루션 폴더에 통채로 포함시키는 편이 공유하기에 편하다.
    2. 현재 사용중인 버전을 아는 것이 좋으니까 gtest-1.3.0 같은 식으로 폴더 이름에 프레임워크 버전을 포함시켜 두도록 한다.
  7. 솔루션에 "기존 프로젝트 추가"를 해서 gtest.vcproj 를 추가한다.
  8. 솔루션에 테스트 프로젝트를 추가한다.
    1. VC++ > 일반 > 빈 프로젝트를 추가하도록 한다.
  9. 테스트 프로젝트의 참조에 gtest 프로젝트를 추가한다.
  10. gtest-1.3.0/src 폴더에 있는 gtest_main.cc 를 테스트 프로젝트 폴더로 복사하고, 테스트 프로젝트에 추가한다.
  11. 테스트 프로젝트의 "추가 포함 디렉터리"에 $(SolutionDir)\gtest-1.3.0\include 를 추가한다.
  12. 테스트 프로젝트와 gtest 프로젝의 구성 속성에서 "C/C++ > 코드 생성" 페이지의 "런타임 라이브러리"를 맞춰준다. (여기서는 다중 스레드 디버그(/MTd)로 맞췄다.)
  13. 테스트 프로젝트의 구성 속성에서 "빌드 이벤트 > 빌드 후 이벤트" 페이지의 "명령줄"에 $(TargetPath) 를 설정해준다. 이렇게 하면 프로젝트가 빌드 된 후 바로 테스트 프로젝트가 실행되고, 실행 결과가 VS 출력 창에 나타난다. gtest-output.png
  14. 실패하는 테스트 케이스가 있는 경우에는 컴파일 에러와 마찬가지로 출력 창에 소스 파일과 라인이 표시되기 때문에 마우스로 더블클릭하면 실패한 라인으로 바로 이동된다.

 

참조:

 

이 글은 스프링노트에서 작성되었습니다.

신고
Posted by wafe

댓글을 달아 주세요

  1. U.Seung 2009.04.19 17:58 신고  댓글주소  수정/삭제  댓글쓰기

    저도 요즘
    Google Test 써보고 있는데ㅋ

    C++ Unit Testing도구는 쓸때마다 n%씩 부족한 느낌이 들어서 이거.ㅎㅎ

    • wafe 2009.04.19 23:37 신고  댓글주소  수정/삭제

      언어가 C++이니 뭐 ㅎㅎ
      그래도 현재로서는 Google Test + Google Mock 조합이 최강이 아닐까 싶네. 아직 Google Mock은 문서만 보는 중이긴 하다만 ;;

  2. decoder 2009.04.20 08:48 신고  댓글주소  수정/삭제  댓글쓰기

    헐퀴 ;; 트랙백 보고 날라왔습니다~~
    윈도 프로그램 만들때 도움되겠네요. 감사합니다 :)

    • wafe 2009.04.20 14:08 신고  댓글주소  수정/삭제

      구글 테스트에 대해 검색하다가 decoder님 블로그에서 정보를 얻었거든요. 저도 뭔가 도움될까 싶어서 트랙백 날려봤습니다. ^^;

  3. 오늘도 공부... 2009.06.26 20:27 신고  댓글주소  수정/삭제  댓글쓰기

    좋은 글 감사드립니다. 적힌 글을 따라서 진행을 하는데, 제대로 되지 않아서 글을 남깁니다.
    실제 테스트에 들어있는 CMoney(개발 프로젝트)에 대한 CMoneyTest 파일은 테스트 프로젝트의 포함을 하는가요? 아니면 개발 프로젝트에 포함을 하는가요? 저는 테스트 프로젝트에 포함을 시켰는데, 에러가 발생을 하네요. T.T 그렇다고 CMoneyTest를 개발 프로젝트에 포함을 시켜면 gtest에 대한 "포함 파일, 라이브러리"등을 포함시켜야 되는데, 그것은 좀 아니듯해서... 질문만 남겨서 죄송합니다.

    • wafe 2009.06.29 17:51 신고  댓글주소  수정/삭제

      안녕하세요 찾아주셔서 고맙습니다.

      테스트 코드가 들어가는 소스 파일들(CMoneyTest 등)은 테스트 프로젝트에 넣어야 됩니다.

      gtest에 같이 제공되는 샘플에 CMoneyTest 라는게 있나해서 찾아봤더니 그런 게 있지는 않군요. 어떤 에러인지 몰라 도움을 못 드리는게 안타깝네요.

      참고로 제가 겪었던 에러 중에 제일 흔한 것은 테스트 프로젝트와 제품 프로젝트의 '런타임 라이브러리'를 동일하게 맞추지 않은 경우였습니다.

  4. zippolook 2010.06.03 12:13 신고  댓글주소  수정/삭제  댓글쓰기

    설명 감사합니다. 저는 1.5버전으로 만들어 봤어요.
    wafe님의 글을 바탕으로 그림 추가하여 제 블로그에 포스팅 하려고 합니다. 그래도 되겠죠?

  5. mooni 2010.06.15 21:23 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 좋은 글 우선 감사드려요 ^^
    저도 윗분들과 똑같이 하는데 계속 LNK2019 에러가 나서요. 하루 종일 삽질을 하고 있네요.
    제가 님이 쓰신 글을 잘못이해하고 있는건 아닌지 확인 좀 해수시면 감사하겠습니다.
    gtest-1.5를 받아 세팅했구요, 솔루션 안에 A 프로젝트, ATest 프로젝트, gtest 이렇게 세개의 프로젝트가 있습니다. gtest는 글 처럼 기존 프로젝트를 추가했구요. A 프로젝트에 gtest에 있는 sample1 파일들을 넣고, ATest 프로젝트에 gtest_main.cc 와 sample1_unittest.cc 를 넣고 빌드를 하게 되면 계속 LNK2019 에러가 나네요. 글에 적힌 부분은 모두 따라했구요.
    혹시 왜 에러가 나는지 아시면 도움 좀 부탁드리겠습니다. 아,
    그리고 테스트 프로젝트의 구성 형식은 응용 프로그램(.exe)로 해놓는게 맞나요? sample1 을 모두 비우고 코드가 없이 실행할 경우 콘솔 창에 제대로 출력이 되는데 sample1 코드를 작성하면 문제가 나네요.
    음.. 장문의 글이 되었네요. ㅎ 염치없지만 혹시 아시면 도움 좀 부탁드리겠습니다.

    • wafe 2010.06.20 20:22 신고  댓글주소  수정/삭제

      블로그를 자주 확인하지 않다보니 답장이 늦었네요.

      1. 프로젝트는 EXE로 해 놓으시면 됩니다.

      2. 제가 지금 당장은 직접 돌려볼 수가 없어서 제 추측으로만 쓰게 되는 걸 좀 양해해주시면 좋겠습니다.

      링크 에러가 발생하는 건 A 프로젝트에 있는 소스 파일을 ATest 프로젝트에 추가해주지 않았기 때문이라고 생각됩니다. ATest 프로젝트에 오른쪽 클릭해서 기존파일 추가 기능을 써서 테스트 대상이 되는 cpp 파일을 추가해주면 될거라고 생각됩니다.

      그래도 링크 에러가 계속된다면 sample1을 컴파일하는데 필요한 lib 같은 게 ATest 프로젝트에는 추가되지 않았다든지 하는 문제일 것 같습니다.

  6. 손님 2010.06.22 22:34 신고  댓글주소  수정/삭제  댓글쓰기

    저도 mooni 님과 똑같은 증상이 나타나네요..
    하루종일 봐도 LNK2019 문제가 해결이 안되는데.. 혹시 원인이 뭘까요?
    1.3 버전으로 해도 증상이 같네요.. ㅜㅜ

    • 손님 2010.06.23 09:05 신고  댓글주소  수정/삭제

      해결했습니다.. ㅠㅠ
      mooni 님도 저랑 똑같이 해결하시면 될 듯 한데요..
      프로젝트가 아닌 솔루션 속성창에 가시면 project dependencies 라는 메뉴가 있습니다.
      거기서 테스트프로젝트가 구글 테스트를 depend on 하도록 설정 해주니까 링크 에러가 없어 졌네요...

2008.11.23 00:31

VS 2010에서 개선되는 것들 분류없음2008.11.23 00:31

RSS를 둘러보다가 S.Somasegar가 쓴 C++ enhancements in VS2010이라는 블로그 포스트를 보았다. 세상에... 아직 VS 6.0을 쓰고 있는데 2010이라니. 이러다보면 VS 2020이 나올 날도 머지 않았겠다.

한국어판 MSDN에 따르면 S.Somasegar는 MS 개발부서의 총 책임자라고 한다.

 

사람 이름이... 정말 뭐라고 읽어야 할 지 모르게 생겼다.

이번에는 전체를 번역하기 보다는 원문에서 언급하고 있는 VS2010의 바뀐점에 대해서 간단히 요약만 해보려고 한다.


VS2010에서는 아주 큰 코드베이스를 가지고 작업하는 개발자들의 생산성을 높여주고자 한다. 큰 코드베이스를 다룰 때 발생하는 비효율성을 개선하기 위해서 IntelliSense 엔진의 아키텍처를 철저히 조사하여 개선했다. 이제는 아주 복잡한 의존성을 가진 소스를 수정한다고 해도 심볼 데이터베이스가 대규모로 업데이트 되는 일은 일어나지 않는다. 많은 곳에서 include 되는 헤더 파일을 자주 수정하거나 프로젝트 설정을 자주 바꾸는 Visual C++ 개발자라면 IDE의 응답성이 엄청나게 향상된 것을 알게 될 것이다.

빌드 시스템도 더 큰 규모의 프로젝트를 다룰 수 있도록 개선된다. VS2010의 MSBuild는 대규모의 복잡한 빌드 환경에 꼭 필요한 높은 커스터마이징 가능성과 확장성, 로깅을 제공한다. 확장성 기능 중에서 한 가지 예로 IDE에서 컴파일러 버전을 선택하는 기능을 들 수 있다. 원문에 첨부된 이미지에서 9.0 컴파일러(VS 2008)와 10.0 컴파일러를 선택할 수 있음을 보여주고 있다.

VS2010은 복잡한 코드베이스를 분석하는 작업을 도와주어 생산성을 높여주는 새로운 도구를 내장하고 나온다. 인텔리센스와 브라우징 기능들의 정확성과 복원력이 개선되었다. 새로운 헤더 의존성 도구는 복잡한 include 계층 구조에 대해서 더 상세한 내용을 찾을 수 있게 해준다. 새로운 Quick Search 기능은 특정 심볼이나 파일로 이동하는 작업을 매우 쉽게 해준다.

라이브러리와 C++ 언어 부분 개선의 핵심은 동시성 지원이다. VS2010에는 Parallel Patterns Library(PPL)가 도입된다. PPL은 멀티 코어 CPU의 장점을 살려 응답성 있는 C++ 응용프로그램을 만들기 위한 새로운 추상 계층을 제공한다. PPL은 병렬성을 표현하는 효율적인 방법과 새로운 비동기 메시징 API-응용프로그램의 응답성과 견고성을 증가시키는-를 제공한다. 또한 VS2010은 C++0x 표준의 새로운 언어 기능을 지원한다. 람다나 'auto' 키워드 같이, PPL을 사용하는 코드를 더 깔끔하고 유지보수하기 쉽도록 작성할 수 있게 해주는 기능이다.

마지막으로, Windows Vista와 Windows 7의 기능을 아주 쉽게 사용할 수 있게 해주는 MFC의 새 기능이 포함된다. 재시작 관리자(restart manager)는 MFC 응용프로그램이 예기치 않게 종료되었을 때 자연스럽게 이전 상태를 복구하는 기능이다. Task 다이얼로그는 문자로만 구성된 메시지 박스 대신 풍부한 사용자 인터페이스를 사용할 수 있게 해주는 기능이다.

여러 해 동안, C++ 개발자들이 Visual C++ 6.0을 사용하던 시기를 Visual C++ 도구의 영광의 날들이라고 언급하는 것을 들었다. 활기있고 생산성 있는 IDE를 그리워하는 개발자들이 많다. Visual C++ 2010으로 Visual C++ IDE의 생산성에 대한 새로운 기준을 만들려고 노력하고 있다.

Visual C++ 팀 블로그에서 새로운 정보를 얻을 수 있고, 개발팀과 직접 소통할 수 있다.

신고
Posted by wafe

댓글을 달아 주세요

  1. ntrolls 2008.11.23 03:58 신고  댓글주소  수정/삭제  댓글쓰기

    헉, 아직 회사에서 VS6 쓰나?

    • wafe 2008.11.23 17:26 신고  댓글주소  수정/삭제

      아직 3, 4 등등 제품들이 남아있어요. 플랫폼 변경은 워낙 큰 일이라서 말이죠. ^^ 새로하는 프로젝트들은 VS2008로 하고 있어요.