고급편 같은 형식으로 중단점 창에서 New 할 때 나오는 데이터 중단점( 사실 이게 조건에서 변경되었을 때 와 같다고 보이기는 하지만 ) 과 필터( 사실 필터는 거의 써본적이 없긴하네요 ) 라든가, When Hit 메뉴( 제가 영문판 VS 라서 한글판에 어떻게 나와있는지 모르겠네요 ^^ ), $err 과 같은 조사식에서 쓰이는 유용한 유사변수들도 정리되면 좋겠습니다.
range-based for-loop, override/final, 강한
형 타입 및 전방 선언 enums
VC++10에서 정말 많은 사랑을 받는 것 중의 하나가 auto라면 이번 VC++11에서는 range-based for-loop라고 생각합니다. 이것은 배열이나
컨테이너들을 사용할 때 편리한데 아래와 같이 사용할 수 있습니다.
int Numbers[3] = { 1, 2, 3 };
for( int &n : Numbers )
{
std::cout << n << std::endl;
}
바로 for( int &n : Numbers )부분이 range-based for-loop 인데 보면 알 수 있듯이 편리와 안전 둘 다를 잡을 수 있습니다.
Variadic Templates
Variadic Templates은 가변 길이 인수 템플릿으로
현재는 올바르게 지원하는 것은 아닙니다. 현재는 매크로를 사용하여 임시적으로 구현되어 있습니다. 기본으로는 최대 5개까지 지원하고 _VARIADIC_MAX 라는 매크로의 값을 변경하면 최대 10개까지
늘릴 수 있습니다.
Stateless lambda
변수를 캡쳐하지 않는 람다 식은 함수 포인터로 변환할 수 있다 라는 사양이 C++ 11에 추가되었는데 이것을 MS에서는 Stateless lambda라고 부릅니다. 이것을 사용하면 Windows 프로시저의 콜백 함수에 람다 식을 사용할 수 있습니다.
WinRT 지원
Windows 8 개발과 관계가 있는 부분입니다.
Windows 8은 Metro
스타일과 데스크 탑 스타일 두 개의 모드를 지원하는데 데스크 탑 모드는 현재 우리가 사용하고 있는 것과 동일한 것이고 Metro 스타일은 테블릿을 위한 모드입니다.
Metro에서 만드는 비 관리형 C++ 코드는 WinRT를 사용합니다.
UI는 XAML을
사용하고 C++ Component Extensions(C++/CX)을 사용하여 닷넷을 경계의 구분 없이
사용할 수 있습니다
VC++ 프로젝트 템플릿을 보면 WinRT와 관련된 것이 새로 많이 생겼습니다. 위 그림의 Direct2D Application이나 Direct3D Application은 모두 WinRT용입니다.
병렬 프로그래밍
새로운 병렬 알고리즘 추가 - parallel_sort,
parallel_reduce, parallel_transform
새로운 병렬 컨테이너 추가 – priority_queue, map 등
추가
스케쥴러 기능 향상
C++ AMP – CUDA와 비슷한 GPU를 사용한 병렬 프로그래밍. DirectX 11의 Direct Compute가 개량 되었다고 생각해도 좋을 것 같습니다.
향상된 IDE
코드 분석 기능 강화
더 똑똑해진 인텔리센스
네이티브 C++도 유닛테스트 지원
코드 커버리지 기능 지원
베타 버전이 나왔고 흥미로운 것들이 많아서 저는 조금씩 조금씩 VC++
11의 새로운 부분을 공부해 나가려고 합니다. 이전처럼 공부한 것들을 여기에 정리해서 올릴
예정이니 관심 있는 분들은 같이 공부해 나가기 바랍니다^^
참고
What's New in Visual Studio 11 Beta for
C++ Developers
AMP는 AcceleratedMassive Parallelism의 약자로 병렬 프로그래밍과 관련된 것입니다.
C++ AMP는 2주 전의 AMD의 Fusion 컨퍼런스에서Microsoft의 Herb Sutter씨가(MS의프로그램 언어 아키텍터 이자 C++ 표준 위원 멤버) 처음으로공개한 것으로 다음 버전의 Visual Studio(현재는Visual C++만)에서 GPGPU 프로그래밍환경을 제공하는 것을 뜻합니다.
병렬 프로그래밍에서 대해서 조금 깊게 공부하신 분들은 아마 GPGPU라는것을 들어본 적이 있으리라 생각합니다. GPGPU는 간단하게 말하자면 GPU를 CPU 처럼 사용하자라는 것으로 GPU의 높은 성능을 사용하여 CPU와 똑 같게는 사용할 수는 없지만연산 처리에서 높은 병렬 기능을 사용하여 CPU보다 훨씬 뛰어난 결과를 얻을 수 있습니다.
현재까지 GPGPU 개발환경은NVIDIA의 Cuda와 오픈 아키텍처인 OpenCL,DirectX 베이스의 DirectCompute가 있습니다.
GPGPU 프로그래밍의 단점은 프로그래밍이 복잡하고 아직 레퍼런스가적다는 단점이 있어서 아직은 일반적인 프로그래밍 영역에 들어오지 못하고 있습니다(사실 아직 일반 병렬프로그래밍도 쉽게 사용하지 못하고 있으니..). 그래서 GPGPU가나온 것은 몇 년이 지났지만 아직 일부 전문 영역에서만 사용되고 있었습니다.
그러나 CPU 아키텍처가 멀티코어에서 헤테로지니어스 아키텍처(이기종의 CPU가 결합.CPU+GPU등)로 서서히 넘어가고 있어서 자연스럽게GPGPU 프로그래밍이 부각되고 있었습니다. 하지만 아직도 개발환경의 뒷받침이 부족한 상태였는데드디어 우리 개발자에게 친숙한 Visual C++에서 이런 문제를 해결하려고 합니다.
C++ AMP는 쉽게 말하면Visual C++에서 GPGPU 프로그래밍을 지원하는 것을 말합니다. Visual C++의 뛰어난 개발환경을 토대로 하여 이때까지 복잡했던GPGPU 프로그래밍을 일반 프로그래밍 하듯이 사용할 수 있게 해줍니다. 이로써 GPGPU가 일반 프로그래밍 영역으로 들어 올 수 있는 큰 계기가 되었다고 생각합니다.
C++ AMP에 대해서 AMD의 Fusion 컨퍼런스에서 데모를 시연한 Daniel Moth의 블로그에올라온 글을 정리하면
개발자의 생산성과 이식성을 저해하지 않고 헤테로지니어스 하드웨어 프로그래밍의 허들을 낮게 하여 프로그래밍 일반영역에서 사용할 수 있도록 한다.
현재의 대 규모 병렬 하드웨어(CPU와 GPU)의 사용을 돕기 위한 것만이 아닌 코드의 투자를 미래에 대비한 디자인으로 하여 견고하도록 한다.
Visual Studio의 일부분으로 또 다른 컴파일러나 다른 구문을배울 필요가 없다.
현재의 C++ 언어를 사용하며 C나다른 파생 언어가 아니다.
Visual Studio vNext와 완벽하게 통합하여 지원한다. 편집, 빌드, 디버그, 프로파일러 등 Visual Studio의 다른 모든 기능이 C++ AMP와 같이 동작한다.
기존의 Concurrency Runtime의 일부로 STL와 비슷한 형태의 라이브러리를 제공하여 amp.h 헤더 파일을제공한다.
병렬화를 주 특징으로 하여 헤테로지니어스 하드웨어 위에서 거대한 다 차원 데이터를 아주 쉽게 동작한다.
유일의 코어 C++ 언어 확장을 도입한다.
DirectX(DirectCompute) 위에 구축하지만 C++ AMP에서는 DirectX의 모습은 나타나지 않는다(즉 DirectX를 몰라도 상관 없다).
또 동 세미나에서 기조 연설을 한 Herb Sutter씨의 강연 중 C++ AMP에 관한 내용으로는
C++ AMP에 의해서 기존의C++에서 큰 변경을 가하지 않으면서 언어를 확장하는 점을 강조하여 새로운 언어가 만들어서 개발자에게 혼란을 주는 것을 피했다라는것을 알림.
언어 확장으로 restrict() 함수와 array_view라는 2개의 type이 Key로 잡음. restrict()는 프로세서 아키텍처에 따라서 실행가능한 기능에 제한을 거는 것이고 array_view는 불 균인한 메모리 공간으로의 접근으로 생기는문제를 회피하기 위한 것으로 메모리 공간을 N 차원의 배열로서 작업하는 것을 뜻한다. 메모리 공간의 추상화라고 할 수도 있다. restrict()와 array_view는 프로세서 아키텍쳐와 메모리 공간의 차이를 흡수할 수 있는 것으로 C++ AMP의 중요한 Key이다.
C++ AMP의 컴파일러는Visual Studio의 차기 버전에서 들어갈 예정으로 릴리스는 이번 연말로 예상하고 있다. 또이 컴파일러는 오픈 사양일 예정으로 Windows 상의 VisualStudio 뿐만이 아닌 그 이외의 개발 환경(C++ Builder이나 이클립스 등)에서도 이용할 수 있도록 AMD와 협력 하여 개발 중이라고 한다.
DirectX의DirectCompute를 사용한다고 하니 C++ AMP를 사용한 프로그램은 Windows Vista 이상에서만 사용할 수 있을 것 같습니다(이유는 DirectCompute가 DirectX 10에서 지원하기 때문).
GPGPU에 관심은 있었지만 아직 시기상조라고 생각하는 분들은 C++ AMP가 나오면 개발 허들이 크게 내려가므로 본격적으로 준비를 해도 좋을 것 같습니다. AMD에서는 헤테로지니어스 컴퓨팅 프로그래밍의 전망을 CUDA 등의독자 사양에서 OpenCL이나 DirectCompute 등의오픈 사양으로 이동하고, 전문 프로그래머만 프로그래밍 하는 시대를2011년까지로 보고 그 이후로는 일반 프로그래머가 완전하게 C++로 프로그래밍하는 헤테로지니어스컴퓨팅 프로그램이 올 것으로 보고 있다고 합니다.
저도 이제 슬슬 GPGPU 프로그래밍 쪽으로 들어가볼 예정인데 일단조만간 OpenCL부터 시작해 볼까 합니다. 연말에 VS의 vNext가 나올 수도 있다고 하니 그때 꼭 C++ AMP를 공부해서 그 내용을 공유하도록 하겠습니다^^
2010에서 지원하던
Architecture tools의 기능을 강화하면서 새로운 기능을 추가
Native의 ALM에
투자를 하여 기존의 많은 ALM 기능을 Native에 대응해
나갈 것임
코드 분석
VS2010에서도 사용할 수 있는 기능으로 vNext에서 더욱 개선
상세한 정보를 전달하기 위해서 UI를 다시 디자인
분석 엔진 개선으로 더욱 강력하게 에러나 경고를 진단
제안을 클릭하면 코드 위에 하이라이트 하여 문제점을 가시화
Architecture
Tools (VS2010에서 지원)
Dependency diagram by binary
Native 애플리케이션의 아키텍처를 동적으로 시각화하여 의존
관계를 빠르게 파악할 수 있음
이름 공간, 타입, 함수 단위로 자유자재로 의존 관계를 시각화
Dependency diagram by include files
헤더 파일의 의존 관계도 그래프화(이 기능 사용하면 빌드 시간
단축을 위해 헤더 파일 정리할 때 정말 좋을 것 같습니다). 헤더 파일에 색을 붙여서 구분이 쉬워짐. 또 이미지 파일로 저장도 가능
Create a layer diagram and run
validation
기존 VS 프로젝트를 드래그&드랍으로
레이어 그림으로 변환. 아키텍처 검증과 의존 관계 생성도 할 수 있음.
아키텍처 검증은 TFS의 자동 빌드로 실행
그리고 드디어 vNext ALM for C++의 끝판왕 소개입니다.
.......
...........
..............
무려C++ Unit Test Framework 지원(뭐 사실 2010에서 닷넷은 이미 지원하고 있죠^^;;).
저는 이 기능은 정말 의외였습니다. 제가 tool에서 가장 지원해주기 바라는 기능이 드디어 들어오네요. 이
세션에서도 이 C++ Unit Test Framework 소개할 때 청중들의 박수갈채가 뿜어져 나왔다고
합니다. 아마 저도 이 세션을 들었으면 기립박수를 했을 것 같네요^^
이제 우리 C++ 프로그래머들도 이제 순정(?) Unit Test Framework을 사용할 수 있어 따로 설치하지 않아도 되고 녹색 버튼과 빨간 버튼을
볼 수 있습니다.
화면 멋지지 않나요? 저는 지금 회사에서 구글의 C++ Unit Test Framework를
사용하고 있는데 UI면에서는 비교를 할 수 없을 정도로 좋네요^^
단위 테스트 프로젝트 템플릿이 있고, CppUnitTest.h,
TEST_CLASS, TEST_METHOD 매크로가 있다고 합니다.
위 그림의 왼쪽이 Unit Test Explorer인데 테스트에
속성을 붙일 수 있는데 이 속성은 TEST_OWNER(), TEST_PRIORITY(),
TEST_IGNORE() 등이 있습니다.
Code Coverage
Unit Test Explorer에서 아이콘 클릭으로 코드 커버리지
데이터 리포트를 볼 수 있습니다.
바이너리 단위, 함수 단위로도 가능합니다. 원래 이 기능은 2010에는 있었지만 닷넷만 가능했죠. 이제 이것을 C++에서도 사용할 수 있습니다.
소스 코드의 하이라이트로 커버리지 상황을 시각화 할 수도 있습니다.
앞서 이야기 했듯이 기존에 닷넷만 지원하는 기능을 앞으로는 C++도
사용할 수 있습니다. 그리고 당연하게 vNext에서 새로
만들어지는 기능도 이젠 차별 없이 C++도 지원한다고 합니다.
vNext에서는 VS의 tool 기능을 반쪽만 아닌 닷넷과 같이 모두 사용할 수 있을 것 같아서 너무 좋네요^^
기억을 더듬어 보면 2008이 나오기 전 2007년 겨울에 MS 본사의
VC++ PM이 왔어 앞으로 VC++의 기능이 혁신적으로 개선 될 것이라고 했을 때 일종의
립 서비스라고 생각했고, 2008이 나왔을 때 역시나(물론
이전보다는 좀 좋아졌지만) 라고 생각했습니다. 그러나 2010이 나오면서 인텔리센스를 새로 만든 것을 보고 립 서비스가 아니었구나 라고 생각하게 되었고 이번 세션을
통해서 MS의 VC++에 대한 확고한 의지를 볼 수 있었습니다.
vNext가 정확하게 언제 나올지는 모르겠지만 VC++은 C++0x 기능과 C++
for ALM 기능으로 기대가 정말 많이 되고 나오면 공부할 것이 많을 것 같습니다.
이번이 SafeInt 라이브러리에 대한 4번째 글이면서 마지막 글입니다. 이전 회의 제 글을 보셨다면 SafeInt가 어떤 것인지, 어떻게 사용하는지 대부분 알게 되셨습니다. 이번에는 SafeInt의 함수 버전에 대해서 설명합니다.
SafeInt 함수
SafeInt 라이브러리에는
SafeInt 클래스의 인스턴스를 만들지 않고 사용할 수 있도록 몇 개의 함수를 지원하고 있습니다.
SafeInt 함수는 정수 오버플로우가 발생하지 않도록 단일 수치 연산을 보호하고 싶을 때 사용합니다. 그리고 복수의 수치 연산을 보호하고 싶을 때는 SafeInt 클래스를
사용하고 함수 버전들을 반복하여 사용하는 것보다는 SafeInt 클래스를 사용하는 것이 더 효율적이라고
합니다.
<코드 1>의
결과를 보면 예외 처리에 의해서 프로그램이 크래쉬 되지 않음을 알 수 있습니다. 그런데 SafeInt를 사용할 때마다 <코드1> 처럼 매번 예외처리를 구현한다는 것은 너무 불편합니다. 불편하면 SafeInt를 기피하게 되겠죠. -_-
다행히 SafeInt는 이런 것도 다 감안해서 만들어져 있습니다. 사전에 예외처리를 미리 정의 해 놓으면 매번 예외처리를 정의할 필요가 없습니다.
SafeInt의 예외처리 정의는 두 가지 방법이 있습니다. 이번 회는 두 가지 방법 중 첫 번째 방법을 소개하고 두 번째 것은 다음 회에 소개 하겠습니다.
SafeInt의 예외처리 – 방법 1
SafeInt의 기본 예외 처리 클래스를 상속 받아서 우리가
원하는 방식으로 정의한 후 그것을 SafeInt의 생성자에 인자로 넘겨주면 SafeInt로 연산 작업을 할 때 예외가 발생하면 우리가 정의한 예외처리를 호출합니다. 백문이불여일견이라고 바로 다음의 코드를 봐 주세요. 아주 간단합니다.
< 코드 2.
SafeInt의 예외처리 방법 1 >
#include <iostream>
#include <safeint.h>
using namespace msl::utilities;
class MySafeIntException : public
SafeIntException
<코드 2>의
결과를 보면 SafeInt로 연산 작업을 할 때 예외처리를 같이 정의하지 않아도 오버플로우로가 발생하면
우리가 정의한 클래스의 멤버 함수를 호출 합니다.
SafeInt의 생성자에 인자로 넘기는 예외처리 클래스는 꼭
SafeIntException클래스를 상속 받고 static
void SafeIntOnOverflow()와 static void
SafeIntOnDivZero()를 재정의해야 합니다.
이것으로 <코드 1>의 예외처리 방식보다는 좀 편리해졌습니다. 그런데 아마 지금도
마음에 들지 않는 분이 있을 것 같습니다. SafeInt를 생성 할 때마다 매번 예외처리 클래스를 인자로
넘기는 것도 귀찮은 분이 있을 것 같네요. 이런 분들을 위해서
SafeInt는 또 하나더 예외처리 방법을 지원합니다. 그것은 다음 회에서 설명하겠습니다.^^
<코드1>를
실행하면 변수 X3와 BigX3의 값이 서로 같을까요? 혹시 같다고 생각하시는 분들은 unsigned int의 최대 값이
얼마인지 MSDN에서 검색해 보세요... 네 결과는 서로 다릅니다. 둘 다 계산에 사용하는 값은 같지만 결과가 다르게 나오는 이유는 unsigned
int로는 X1과 X2를 곱해서 나온 값을 보관할 수
없기 때문입니다. X3 = X1 * X2에서 X3는 오버플로우가
발생하여 상위 비트가 삭제되어 올바른 계산 값이 저장되지 않습니다.
<코드 1의
결과>
<코드 1>의
코드는 사실 별로 길지 않은 코드이기 때문에 실행하기 전에 오버플로우가 발생하리라는 것을 충분히 예상할 수 있고,
혹은 실행 후에 X3의 값이 예상하지 못한 값이 들어가 있어도 문제를 쉽게 파악할 수 있을
것입니다. 그러나 우리가 만드는 애플리케이션은 복잡하고 긴 코드를 가지고 있습니다. <코드 1>과 같은 오버플로우에 의해서 버그가 발생하면
쉽게 버그를 찾기 힘들고 특히 오버플로우에 의해 애플리케이션이 오 동작하여 크래쉬가 발생할 수도 있습니다.
안전한 애플리케이션을 만들기 위해서는 안전한 코드를 만들어야 합니다. 보통
안전한 코드를 생각하면 포인터 조작과 문자열 조작을 주로 중요하게 다루고 VC++에서도 안전한 문자열
조작 위해 ‘_s’가 붙은 문자열 조작함수를 사용하도록 VC++에서
종용하고 있어서 요즘은 대 부분 이것을 사용하고 있습니다. 그러나 정수 계산에 대해서는 안전한 코드를
위해 지원해 주는 것이 없었습니다.
SafeInt 란?
VC++ 10에서는 안전한 정수 계산을 위해서 새로운 라이브러리를
지원해 줍니다. 이 라이브러리의 이름은 SafeInt입니다. SafeInt는 C++의 템플릿으로 만들어서 char 형에서 __int64 형까지
8비트에서 64비트 사이의 크기를 가진 모든 정수 형을 사용할 수 있습니다.
SafeInt 라이브러리를 사용하면 결과를 담을 변수의 형 보다
큰 정수 값 연산을 하거나 0으로 나누기 연산을 할 때 발생하는 오버플로우를 감지 할 수 있습니다.
SafeInt 사용
SafeInt를 사용하기 위해서는 헤더 파일 safeint.h 를 포함하고 msl::utilities 이름 공간을
선언해야 합니다.
< 코드 2 >
#include <iostream>
#include <safeint.h>
using namespace msl::utilities;
int main()
{
SafeInt<unsigned
int> X1(1234567);
unsigned
int x2 = 1234567;
SafeInt<unsigned
int> X2(x2);
SafeInt<unsigned
int> X3 = X1 * X2;
getchar();
return
0;
}
<코드 2>를
디버그 모드에서 실행하면 아래와 같은 ASSERT 메시지가 발생합니다.
이유는 오버플로우가 발생했기 때문입니다. 그러나 릴리즈 모드에서는 ASSERT 메시지가 발생하지
않습니다. 다만 크래쉬가 발생합니다. -_-;;
오버플로우에 의해서 디버그 모드에서는 ASSERT 메시지, 릴리즈 모드에서는 크래쉬가 발생하는 이유는
SafeInt<unsigned int> X3 = X1 *
X2;
에서 예외가 발생하기 됩니다. SafeInt를 사용하는 경우
오버플로우가 발생하면 예외를 발생시키기 때문에 try{} catch{}로 예외를 처리해 주지 않으면
안됩니다. 예외 처리가 올바르게 하면 오버플로우가 발생했을 때 발생하는 문제를 올바르게 대처하던가 어디에서 어떻게 오버플로우가 발생했는지 쉽게 알 수 있습니다.
그리고 SafeInt는 일반 정수형과 같이 연산을 할 수도 있다.
<코드 3>
#include <iostream>
#include <safeint.h>
using namespace msl::utilities;
int main()
{
SafeInt<unsigned
int> X1(1234567);
unsigned
int X2 = 123;
SafeInt<unsigned
int> X3 = X1 * X2;
getchar();
return
0;
}
이번 회에는 간단하게 정수 연산 시의 오버플로우 문제와 SafeInt가
무엇인지, SafeInt의 간단한 사용 방법만 설명하였습니다.
본문과 관련해서 VC++ 디렉터리 -> 포함 디렉터리, 라이브러리
디렉터리에서 프로젝트 디렉토리를 설정하는 것과 C/C++ -> 일
반 -> 추가 포함 디렉터리와 링커 -> 일반 -> 추가 라이브러리
디렉터리에서 프로젝트 디렉토리를 설정하는 것에는 어떤 차이
가 있는지 궁금합니다.
VS.NET(VS2002)에서
MFC 프로젝트로 만들었던 프로그램을 VC++10 프로젝트로 변환하여 컴파일 했더니 에러가 발생하면서 아래의 경고가 나왔습니다.
C:\Program Files\Microsoft Visual Studio
10.0\VC\atlmfc\include\atlcore.h(35):#error This file requires _WIN32_WINNT to
be #defined at least to 0x0403. Value 0x0501 or higher is recommended.
에러 내용은 프로젝트에서 정의된 _WIN32_WINNT 버전이 0x403인데
atlcore.h는이버전이최소 0x0501 이상이되어야한다는것입니다.
그래서_WIN32_WINN를정의한 stdafx.h 파일을열어보니
#define _WIN32_WINNT 0x0400
되어 있었더군요. 그래서 일단 이것을 최신이 좋다라는 생각에 아래와
같이 했습니다. ^^;;
#define _WIN32_WINNT 0x0600
그랬더니 이제는 아래와 같은 에러가 나오더군요. -_-;
c:\program files\microsoft visual studio
10.0\vc\atlmfc\include\afxcmn3.inl(29): error C2065: 'CCM_SETWINDOWTHEME' : 선언되지
않은 식별자입니다.
그래서 바로 구글링 들어갔습니다.
쉽게 저와 같은 에러가 나와서 질문을 올린 글을 찾았고 답변도 보았습니다.
문제 해결은 stdafx.h 파일에 정의된 버전의 숫자를 아래와 같이
하면 된다고 하더군요
// Modify the following defines if you have
to target a platform prior to the ones specified below.
// Refer to MSDN for the latest info on corresponding values for different
platforms.
#ifndef WINVER // Allow use of features specific to Windows 95 and Windows NT 4
or later.
#define WINVER 0x0501 // Change this to the appropriate value to target Windows
98 and Windows 2000 or later.
#endif
#ifndef _WIN32_WINNT // Allow use of features specific to Windows NT 4 or
later.
#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target
Windows 98 and Windows 2000 or later.
#endif
#ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or
later.
#define _WIN32_WINDOWS 0x0501 // Change this to the appropriate value to target
Windows Me or later.
#endif
#ifndef _WIN32_IE // Allow use of features specific to IE 4.0 or later.
#define _WIN32_IE 0x0500 // Change this to the appropriate value to target IE
5.0 or later.
#endif
이렇게 하니 문제 없이 빌드가 성공 되었습니다.
주위에서 VC++의 새로운 버전이 나와도 쉽게 사용하지 못하는 경우가
오래 전에 만들었던 프로젝트를 포팅 할 수 없어서 이전 버전을 어쩔 수 없이 사용한다는 이야기를 종종 듣습니다.
그러나 저는 운이 좋아서인지 2002버전부터 순차적으로 새 버전의 VC++을 사용할 수 있어서 VC++6에서 VS2002로 넘어갈 때만 빌드 문제를 겪었습니다.
그래서 이런 포팅에 대한 문제는 잘 알지 못합니다. 이번에는 예전에
만들었던 코드를 C++0x 코드로 바꾸고 싶어서 오래 전에 만들었던 프로젝트를 VC++ 10로 포팅하면서 정말 정말 오랜만에 이런 문제를 겪어 보게 되고 해결 방법을 포스팅 할 수 있었습니다.
VC++ 10은 C++0x나
병렬 프로그래밍 라이브러리 이외에도 툴적인 측면에서도 여러 좋은 기능들이 추가 되었습니다. 알고 있으면
작업할 때 편리한데 시간이 부족하여 제가 아직 자세하게 찾아보지 못해서 소개하지 못한 것이 많이 아쉽습니다. 그래서
짥은 것이라도 틈틈이 시간나면 소개하려고 합니다.
댓글을 달아 주세요
감사합니다.
지금껏 단순한 디버깅 기능만 이용했었는데
덕분에 디버깅작업도 효율적으로 할 수 있을것 같습니다.
글 잘 봤습니다. 디버깅에 관해서 내용이 매우 잘 정리되어있네요.
고급편 같은 형식으로 중단점 창에서 New 할 때 나오는 데이터 중단점( 사실 이게 조건에서 변경되었을 때 와 같다고 보이기는 하지만 ) 과 필터( 사실 필터는 거의 써본적이 없긴하네요 ) 라든가, When Hit 메뉴( 제가 영문판 VS 라서 한글판에 어떻게 나와있는지 모르겠네요 ^^ ), $err 과 같은 조사식에서 쓰이는 유용한 유사변수들도 정리되면 좋겠습니다.
다음에 VS 11 관련 글을 쓰게되면 그때는 좀더 고급적인 내용을 다루어보도록 하겠습니다^^
고생스럽게 작성하신 문서인데 공개해 주셔서 감사합니다.
잘 보겠습니다~