3. MOTIVATION
새로운 기능
• 클래스 위자드
문법 자동 완성 기능
개선된 기능
• 인텔리 센스
레이 인트
수정된 기능
• 컴파일러 버그 수정
향상된• 문법 자동 완성 기능
• 인텔리센스 라이브 에러
리포팅
• WPF를 이용한 UI 구성
• 브레이크 포인트
• 디버깅 기능
• Find and Replace
• Call Hierarchy
• 향상된 Add-in Support
• SQL Compact
Database를 이용한 인
텔리 센스 DB파일WPF를 이용한 UI 구성
• PPL
• 병열 스택 윈도우
• 병열 작업 디버그 윈도
우
Call Hierarchy
• 자주 사용하는 클래스의
임베딩
• 최신 윈도즈용 애플리케
이션 개발 지원
• 대용량 코드 지원
• 멀티 스레드 디버깅
• 덤프 파일 분석
우
• C++0x
• MSBuild
이션 개발 지원
• 최신 윈도즈에 VS가 잘
운영되도록 수정
• 브레이크 포인트 관리레이 인 관리
• 세밀한 빌드/링크 정보
2010-05-31
3
5. EMBEDDED CLASS -
SAFEINT
오버 플로우로 인한 오류를 방지하는 정수형 클래스
8bit 정수의 경우 200 + 100의 결과는 44
기계적으로 우아하게 이루어 지는 오버 플로우
#include <safeint.h>
i l tilitiusing namespace msl::utilities;
void foo()
{
SafeInt<unsigned int, _SAFEINT_DEFAULT_ERROR_POLICY> safeInt;
}}
2010-05-31
5
6. DEMO
최신 개발 환경 지원
Add-in : Go To Definition
데이터 피닝
DUMP파일
2010-05-31
6
8. AGENDA
Visual Studio 와 SDK
새로워진 Build System 소개
Multi Targeting
새로운 키워드
auto, static_assert, nullptr(__nullptr)
CRT 강제 종료 문구
트라이그래프
Library 배포 정책 변경b a y 배 정책 변경
2010-05-31
8
10. BUILD SYSTEM
빌드 환경을 꾸미기에 제한적임
모든 빌드 과정은 커맨드 라인으로 기술 되어 컴파일러 바
이너리 내부적으로 처리.
개발툴의 버전마다 모두 다름
제품 개발툴 컴파일툴 업그레이드 긴급패치
app1.exe VS2003 VS2003 x o
2 VS200 VS200app2.exe VS2005 VS2005 x o
app3.exe VS2008 VS2008 o o
2010-05-31
10
11. BUILD SYSTEM
애플리케이션에 따라 빌드 환경을 꾸미기 위한 Visual Studio 혹은
Visual C++툴을 설치
프로젝트 파일(.vcproj)이 VS에 종속되어 있음.
크로스 컴파일이 안됨 (VS2005 <-/-> VS2008)
상위 버전의 VS에서 하위버전의 VS 프로젝트 파일을 여는 방법은
오로지 마이그레이션 위자드,
제품 개발툴 컴파일툴 업그레이드 긴급패치
app1.exe VS2003 VS2003 x o
app2 exe VS2005 VS2005 x oapp2.exe VS2005 VS2005 x o
app3.exe VS2008 VS2008 o o
2010-05-31
11
13. MULTI TARGETING
멀티타겟팅
최신버전이 제공하는 IDE 및 코딩, 디버깅 환경을 이용
하위 호환의 바이너리 생성
다양한 플랫폼의 프로젝트를 섞어 사용
Visual Studio 2005에서 .NET 언어에 지원
Native 언어를 위한 멀티타겟팅
VS2010은 Windows 2000을 지원하지 않음. 그럼 어떻게?
2010-05-31
13
14. MULTI TARGETING
프로젝트 파일이 VS의 버전에 종속되지 않는 XML양식으로 변경
툴셋을 설정하여 범용적인 컴파일러를 선택하는 환경
새로운 프로젝트 파일을 참조하여 툴셋마다 다른 방법을 제공하는
빌드환경이 가능해짐
VS2010을 에디터로 사용하면서 컴파일러 멀티 타겟팅이 가능해짐
이전 VS를 풀로 설치할 필요 없이 컴파일러만 설치 하면 됨.
VS2010과 필요한 SDK 설치 만으로 많은 플랫폼 지원 가능
2010-05-31
14
15. MULTI TARGETING
Project -> Properties -> Configuration Properties -> General -
> Platform Toolset
플랫폼 툴셋 = 컴파일러 + 컴파일에 필요한 도구 + 라이브러리 + 헤
더파일 + 링커
IDE를 제외하고 바이너리를 생성하는데 필요한 전체 셋IDE를 제외하고 바이너리를 생성하는데 필요한 전체 셋
2010-05-31
15
16. MULTI TARGETING
지원하는 플랫폼
플랫폼 툴셋을 만들 수 있는 모든 환경 지원
VS2008, 2005… 2002… VC6… CE/Windows Mobile..
문제가 있을 경우 도움을 받으세요
“특정 버전의 플랫폼 툴셋을 구성하기 위해서 해당 Visual Studio
혹은 Visual C++을 모두 설치해야 하나요?”
VC6 : Platform SDK Feb. 2003
VS2008 : Windows SDK for Windows server 2008
VS2010 : Windows SDK for Windows7
2010-05-31
16
17. MULTI TARGETING
커스텀 컴파일러 설정
%PROGRAMFILES%MSBuildMicrosoft.Cppv4.0Platforms
Win32PlatformToolsets
Microsoft.Cpp.<Platform>.<PlatformToolset>.props
Microsoft.Cpp.Win32.v100.props
Microsoft.Cpp.Win32.v100.targets
기본 컴파일러 설정
%PROGRAMFILES%MSBuildMicrosoft.Cppv4.0Platforms
Win32Microsoft.Cpp.Win32.default.props
2010-05-31
17
18. NEW KEYWORD -
AUTO
기억 부류 지정자(Storage Class Specifier) : 일반적으로 선언자
앞에 쓰여 컴파일러에게 할당되는 공간의 존속시간과 가시성을 알
려주는 키워드려주는 키워드
auto, register, static, extern / mutable
auto
l l lif ti 을 가지는 t ti 변수local lifetime을 가지는automatic 변수
블록 안쪽에서만 유효하며 선언시 초기화를 해야 함.
2010-05-31
18
19. NEW KEYWORD -
AUTO
C++0x에서 auto는 기억 부류 지정자가 아닌 타입 연역자(Type
Deduction)로 키워드가 사용됨
타입 연역자 : 초기화 되는 값에 따라 변수의 타입이 정해지게 됨타입 연역자 : 초기화 되는 값에 따라 변수의 타입이 정해지게 됨.
템플릿의 이터레이터 선언이나 람다 표현식, 함수포인터등에 유연하게
사용됨
auto a = 1; // int
auto b = “abcd”; // basic_string<char>
auto c = new A(); // class A
t 를 타입 연역자가 아닌 기억 부류 지정자로 사용
auto c new A(); // class A
auto를 타입 연역자가 아닌 기억 부류 지정자로 사용
Project -> Properties -> Configuration Properties ->
C/C++ -> Command Line에 /Zc:auto- 추가
2010-05-31
19
20. NEW KEYWORD –
STATIC_ASSERT
실행시점 이전인 컴파일 시점에 코드를 검증
템플릿의 구현체 코드를 정확하게 사용했는지 검증하는데 유용하게
사용
template<typename T>
b l C (T 1 T 2)bool Compare(T v1, T v2)
{
static_assert(std::tr1::is_integral<T>::value, "숫자가 아님");
return v1 > v2;
}}
2010-05-31
20
21. NEW KEYWORD –
NULLPTR, __NULLPTR
C++에선 없는 값을 표현하는 값이 존재하지 않았음.
델파이의 nil
#ifdef __cplusplus
#define NULL 0
#else
void foo(TCHAR const * str) {};
void main()
#else
#define NULL ((void *)0)
#endif
{
foo(false); // 컴파일 성공
foo(true); // 컴파일 실패
}
0이 특정 값이면 0xFFFFFFFF0이 특정 값이면 0
nullptr, __nullptr이 새로운 키워드로 추가
2010-05-31
21
22. 그밖에,..
CRT 함수가 사용하는 힙 지정 __MSVCRT_HEAP_SELECT 환경
변수 제거
/OPT:WIN98, /OPT:NOWIN98 제거
삭제된 항목들은 대안이 없음.
2010-05-31
22
24. CRT ABORT DIALOG
terminate(), abort()
애플리케이션에서 terminate가 호출됐다는 것은 종료가 의도
CRT의 종료 메시지는 불필요
만일, 종료 다이얼로그 및 메시지를 인식하는 UI테스트 코드와 같은
경우 변경이 필요
2010-05-31
24
25. TRIGRAPH
C코드는 7비트 ASCII에 포함된 문자로 구성되는 것이 표준
1983년에 지저오딘 83개의 문자를 가진 ISO 646-1983 문자셋 지원
83개의 문자를 벗어나는 문자는 별도의 방법을 통해 입력할 수 있도
록 트라이 그래프를 지원 및 인식
Visual C++ 컴파일러는 트라이 그래프를 지원
Trigraph Equivalent Trigraph Equivalent Trigraph Equivalent
??= # ??( [ ??< {
??/ ??) ] ??> }??/ ??) ] ??> }
??' ^ ??! | ??- ~
??=include <iostream> // #include<iostream>
id i ()void main()
??<
std::cout << "??/??/" << std::endl; // cout << "" << endl;
??>
2010-05-31
25
26. TRIGRAPH
잘 쓰이지 않는 지원에 따른 불편함이 존재
C4837 Warning
‘?’는 이스케이프 시퀀스로 ‘?’ 사용
TCHAR* str1 = TEXT("C:*.P??");
TCHAR* str2 = TEXT("Typ1 (*.p??)|*.p??|Typ2 (*.d??)|*.d??|Alle Dateien
(*.*)|*.*||");
CFileDialog FileDialog(TRUE, NULL, str1, OFN_FILEMUSTEXIST, str2, NULL);
Visual Studio 2010에서는 트라이그래프의 기본 옵션이 Disablesua Stud o 0 0에서는 라이 래 의 기본 옵션이 sab e
/Zc:trigraphs
2010-05-31
26
27. LIBRARY 배포 정책 –배 정책
LEGACY
지금까지의 Library 배포 정책은 격리된 응용 프로그램(Isolated
Application), Side-by-side로 요약됨
격리된 응용 프로그램 : manifests를 이용하여 private 어셈블리와,
shared 어셈블리를 애플리케이션의 manifest로 기술
Shared 어셈블리는 Side by side 어셈블리 형태로 설치 재배포 패Shared 어셈블리는 Side-by-side 어셈블리 형태로 설치. 재배포 패
키지를 이용.
Private 어셈블리는 실행파일과 함께 배포/설치 되고 해당 설치 프Private 어셈블리는 실행파일과 함께 배 /설치 되 해당 설치
로그램만을 위해 사용되는 어셈블리.
Shared 어셈블리 권장.
2010-05-31
27
28. LIBRARY 배포 정책 – SIDE-LIBRARY 배포 정책 SIDE
BY-SIDE ASSEMBLIES권장
Side-by-side 어셈블리는 DLL 버전이 충돌하는 것을 막아줌
다양한 버전의 COM이나 윈도즈 어셈블리가 실행 되도 side-by-
side 어셈블리를 공유함.
애플리케이션 제공 업체나 관리자는 Side-by-side 어셈블리를
publisher configuration file이나 per application configurationpublisher configuration file이나 per-application configuration
파일 생성/변경으로 업데이트 할 수 있다.
Side-by-side 어셈블리 업데이트 과정에서 반드시 재배포 패키지를Side by side 어셈블리 업데이 과정에서 반 시 재배 패키지를
설치하거나 제품을 다시 설치할 필요가 없다
2010-05-31
28
29. LIBRARY 배포 정책 – 어배 정책 어
셈블리 검색 순서
1. Side-by-side는 ko-kr 버전을 WinSxS에서 찾음.
2. c:myappko-krmyasm.dll
3. c:myappko-krmyasm.manifest
4. c:myappko-krmyasmmyasm.dll
5. c:myappko-krmyasmmyasm.manifest5. c:myappko krmyasmmyasm.manifest
6. Side-by-side는 ko 버전을 WinSxS에서 찾음.
7. c:myappkomyasm.dll
8. c:myappkomyasm.manifest
9. c:myappkomyasmmyasm.dll
10 c:myappkomyasmmyasm manifest10. c:myappkomyasmmyasm.manifest
11. Side-by-side는 en-us 버전을 WinSxS에서 찾음.
12. c:myappen-usmyasm.dll
13. c:myappen-usmyasm.manifest
14. c:myappen-usmyasmmyasm.dll
15 c:myappen usmyasmmyasm manifest15. c:myappen-usmyasmmyasm.manifest
16. Side-by-side는 en 버전을 WinSxS에서 찾음.
17. c:myappenmyasm.dll
18. c:myappenmyasm.manifest
19. c:myappenmyasmmyasm.dll
20 if t20. c:myappenmyasmmyasm.manifest
21. Side-by-side는 언어가 없는 버전의 라이브러리를 WinSxS에서 찾음.
22. c:myappmyasm.dll
23. c:myappmyasm.manifest
24. c:myappmyasmmyasm.dll
2010-05-31
29
25. c:myappmyasmmyasm.manifest
30. LIBRARY 배포 정책 –배 정책
LEGACY
<assembly xmlns="urn:schemas microsoft com:asm v1" manifestVersion="1 0"><assembly xmlns= urn:schemas-microsoft-com:asm.v1 manifestVersion= 1.0 >
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
</requestedPrivileges>q g
</security>
</trustInfo>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.1"
A hit t " 86" bli K T k "1f 8b3b9 1 18 3b"></ bl Id tit >processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8"y y yp
processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
</assembly>
서비스팩 설치 이후 라이브러리를 모두 재 컴파일, 바인딩 상수 선언
Static 빌드, policy 확인 또는 <이미지이름>.config의 bindingRedirect로 정책 변경
임의의 버전을 선택해서 메니페스트를 구성
2010-05-31
30
31. LIBRARY 배포 정책 –배 정책
LEGACY
“같은 폴더에 라이브러리가 있는데도 실행이 안되요”
“재배포 패키지를 삭제하니 애플리케이션이 실행되지 않아요”
“시키는 대로 다 했는데도 애플리케이션이 실행되지 않아요”
“클라이언트 PC의 정책 설정과 manifest설정이 어려워요”
2010-05-31
31
32. LIBRARY 배포 정책
중앙 배치
CentralCentral
Deployment
지역 배치
정적 링크
Local
Deployment
정적 링크
static linking
2010-05-31
32
33. LIBRARY 배포 정책
중앙 배포 : system32 폴더에 라이브러리들을 복사, system32안
에 들어 있기 때문에 윈도우 업데이트가 쉽게 찾을 수 있어 라이브러
리 업데이트가 용이 재배포 패키지나 머지 모듈을 통하여 배포리 업데이트가 용이. 재배포 패키지나 머지 모듈을 통하여 배포.
지역 배포 : 애플리케이션이 위치한 폴더에 라이브러리 파일들을 위
치 시키는 방식이며 간편하게 해당 애플리케이션만 적용. 중앙 배포
와의 차이점은 윈도 라이브러리를 통하여 업데이트를 하지 않는가
차이
정적 링크 애플리케이션 안쪽에 라이브러리를 포함정적 링크 : 애플리케이션 안쪽에 라이브러리를 포함.
2010-05-31
33
34. LIBRARY 배포 정책
Visual Studio 2010의 라이브러리는 Side-by-side 폴더에 생성되
지 않는다.
지역 배치 방식이 우선적임
OS 관련 라이브러리는 중앙 배포 우선
2010-05-31
34
35. 궁금한 것이 있을 때 포럼을
http://social.msdn.microsoft.com/Forums/en-
US/category/visualc
2010-05-31
35
36. REFERENCE
Breaking Changes in Visual C++ - MSDN 라이브러리
http://msdn.microsoft.com/en-
us/library/bb531344(v=VS.100).aspx
Exploring New C++ and MFC Features in Visual Studio 2010 -
Sumit KumarSumit Kumar
http://msdn.microsoft.com/en-us/magazine/ee336130.aspx
D l t i Vi l C++ 2010Deployment in Visual C++ 2010
http://msdn.microsoft.com/en-
us/library/dd293574%28VS.100%29.aspxus/library/dd293574%28VS.100%29.aspx
2010-05-31
36