Visual C++ 2003 ~ 2015의 새로운 기능Visual C++ What's New 2003 through 2015

이 페이지에는 Visual Studio 2015에서 2003까지 모든 버전의 Visual C++에 대한 "새로운 기능" 페이지가 모두 수집되어 있습니다.This page gathers all the "What's New" pages for all versions of Visual C++ from Visual Studio 2015 back to 2003. 이 정보는 이전 버전의 Visual C++에서 업그레이드하는 데 유용한 경우에 편의를 위해 제공됩니다.This information is provided as a convenience in case it might be useful when upgrading from earlier versions of Visual C++.

참고 Visual Studio 2017에 대한 자세한 내용은 Visual Studio 2017의 Visual C++에 대한 새로운 기능Visual Studio 2017의 Visual C++에서 규칙 향상을 참조하세요.Note For information about Visual Studio 2017, see What's new for Visual C++ in Visual Studio 2017 and Conformance Improvements in Visual C++ in Visual Studio 2017.

Visual Studio 2015의 새로운 C++ 기능What's New for C++ in Visual Studio 2015

Visual Studio 2015 이상 버전에서 컴파일러 규칙이 지속적으로 향상됨으로써 컴파일러에서 기존의 소스 코드를 인식하는 방식이 변경되는 경우가 있습니다.In Visual Studio 2015 and later, ongoing improvements to compiler conformance can sometimes change how the compiler understands your existing source code. 이로 인해 빌드 중 새로운 오류 또는 다른 오류가 발생하거나, 이전에 빌드되어 올바르게 실행되는 것처럼 보이는 코드가 다르게 동작할 수도 있습니다.When this happens, you might encounter new or different errors during your build, or even behavioral differences in code that previously built and seemed to run correctly.

다행히 이러한 차이는 대부분의 소스 코드에 거의 또는 전혀 영향을 주지 않으며, 차이를 해결하기 위해 소스 코드 변경이나 기타 변경이 필요한 경우에도 대체로 간단히 처리할 수 있는 사소한 수정입니다.Fortunately, these differences have little or no impact on most of your source code and when source code or other changes are needed to address these differences, fixes are usually small and straight-forward. 이전에는 허용되는 소스 코드였지만 변경해야 할 수 있는 코드(이전) 및 수정 코드(이후)의 많은 예가 포함되어 있습니다.We've included many examples of previously-acceptable source code that might need to be changed (before) and the fixes to correct them (after).

이러한 차이가 소스 코드나 다른 빌드 아티팩트에 영향을 줄 수도 있지만 Visual C++ 버전 업데이트 간의 이진 호환성에는 영향을 주지 않습니다.Although these differences can affect your source code or other build artifacts, they don't affect binary compatibility between updates to Visual C++ versions. 보다 심각한 종류의 변경인 주요 변경 내용은 이진 호환성에 영향을 줄 수 있지만 이러한 종류의 이진 호환성 중단은 Visual C++의 주 버전 간에만 발생합니다.A more-severe kind of change, the breaking change can affect binary compatibility, but these kinds of binary compatibility breaks only occur between major versions of Visual C++. 예를 들어 Visual C++ 2013과 Visual C++ 2015 간에 발생합니다.For example, between Visual C++ 2013 and Visual C++ 2015. Visual C++ 2013과 Visual C++ 2015 사이에 발생한 주요 변경 내용에 대한 자세한 내용은 Visual C++ 변경 기록 2003 - 2015를 참조하세요.For information on the breaking changes that occurred between Visual C++ 2013 and Visual C++ 2015, see Visual C++ change history 2003 - 2015.

Visual Studio 2015의 규칙 향상Conformance Improvements in Visual Studio 2015

  • /Zc:forScope- 옵션 /Zc:forScope- 컴파일러 옵션은 사용되지 않으며 이후 릴리스에서 제거됩니다./Zc:forScope- option The compiler option /Zc:forScope- is deprecated and will be removed in a future release.

     Command line warning  D9035: option 'Zc:forScope-' has been deprecated and will be removed in a future release
    

    옵션은 대개 표준에 따라 범위를 벗어나야 하는 지점 뒤에서 루프 변수를 사용하는 비표준 코드를 허용하려고 사용됩니다.The option was usually used in order to allow nonstandard code that uses loop variables after the point where, according to the standard, they should have gone out of scope. /Za를 사용하지 않으면 루프 끝에 for 루프 변수를 항상 사용할 수 있으므로 /Za 옵션으로 컴파일할 경우에만 필요합니다.It was only necessary when you are compiling with the /Za option, since without /Za, using a for loop variable after the end of the loop is always allowed. 표준 준수가 중요하지 않으면(예: 코드가 다른 컴파일러에 이식 가능하지 않은 경우) /Za 옵션을 해제하거나 언어 확장 사용 안 함 속성을 아니요로 설정할 수 있습니다.If you don't care about standards conformance (for example, if your code isn't meant to portable to other compilers), you could turn off the /Za option (or set the Disable Language Extensions property to No). 이식 가능한 표준 규격 코드를 작성해야 하면 변수의 선언을 루프 외부 지점으로 이동하여 표준을 따르도록 코드를 다시 작성해야 합니다.If you do care about writing portable, standards-compliant code, you should rewrite your code so that it conforms to the standard by moving the declaration of such variables to a point outside the loop.

     // zc_forScope.cpp
     // compile with: /Zc:forScope- /Za
     // C2065 expected
     int main() {
        // Uncomment the following line to resolve.
        // int i;
        for (int i =0; i < 1; i++)
           ;
        i = 20;   // i has already gone out of scope under /Za
     }
    
  • /Zg 컴파일러 옵션Zg compiler option. /Zg 컴파일러 옵션(함수 프로토타입 생성)은 더 이상 사용할 수 없습니다.The /Zg compiler option (Generate Function Prototypes) is no longer available. 이 컴파일러 옵션은 이미 사용되지 않습니다.This compiler option was previously deprecated.

  • mstest.exe를 사용하여 명령줄에서 C++/CLI에 대한 단위 테스트를 더 이상 실행할 수 없습니다.You can no longer run unit tests with C++/CLI from the command-line with mstest.exe. 대신 vstest.console.exe를 사용합니다.Instead, use vstest.console.exe

  • mutable 키워드mutable keyword. 이전에 오류 없이 컴파일했던 위치에서 mutable 저장소 클래스 지정자가 더 이상 허용되지 않습니다.The mutable storage class specifier is no longer allowed in places where previously it compiled without error. 현재 컴파일러에서는 오류 C2071(저장소 클래스가 잘못되었습니다.)을 표시합니다.Now, the compiler gives error C2071 (illegal storage class). 표준에 따라 mutable 지정자는 클래스 데이터 멤버의 이름에만 적용되고 const 또는 static으로 선언된 이름과 참조 멤버에는 적용할 수 없습니다.According to the standard, the mutable specifier can be applied only to names of class data members, and cannot be applied to names declared const or static, and cannot be applied to reference members.

    예를 들어, 다음 코드를 고려하세요.For example, consider the following code:

     struct S {
         mutable int &r;
     };
    

    이전 Visual C++ 컴파일러 버전에서는 이를 허용했으나 현재 컴파일러에서는 다음 오류를 표시합니다.Previous versions of the Visual C++ compiler accepted this, but now the compiler gives the following error:

     error C2071: 'S::r': illegal storage class
    

    오류를 수정하려면 중복 mutable 키워드를 제거하세요.To fix the error, simply remove the redundant mutable keyword.

  • char_16_t 및 char32_t char16_t 또는 char32_t는 기본 제공으로 처리되므로 typedef에서 이러한 형식을 별칭으로 더 이상 사용할 수 없습니다.char_16_t and char32_t You can no longer use char16_t or char32_t as aliases in a typedef, because these types are now treated as built-in. 사용자와 라이브러리 작성자가 char16_tchar32_t를 각각 uint16_tuint32_t의 별칭으로 정의하는 것이 일반적이었습니다.It was common for users and library authors to define char16_t and char32_t as aliases of uint16_t and uint32_t, respectively.

     #include <cstdint>
    
     typedef uint16_t char16_t; //C2628
     typedef uint32_t char32_t; //C2628
    
     int main(int argc, char* argv[])
     {
     uint16_t x = 1; uint32_t y = 2;
     char16_t a = x;
     char32_t b = y;
     return 0;
     }
    

    코드를 업데이트하려면 typedef 선언을 제거하고 이들 이름과 충돌하는 다른 식별자의 이름을 바꿉니다.To update your code, remove the typedef declarations and rename any other identifiers that collide with these names.

  • 비형식 템플릿 매개 변수 명시적 템플릿 인수를 제공하는 경우 비형식 템플릿 매개 변수가 포함된 특정 코드에서 형식 호환성을 올바르게 검사합니다.Non-type template parameters Certain code that involves non-type template parameters is now correctly checked for type compatibility when you provide explicit template arguments. 예를 들어 다음 코드는 이전 Visual C++ 버전에서는 오류 없이 컴파일되었습니다.For example, the following code compiled without error in previous versions of Visual C++.

     struct S1
     {
         void f(int);
         void f(int, int);
     };
    
     struct S2
     {
         template <class C, void (C::*Function)(int) const> void f() {}        
     };
    
     void f()
     {
         S2 s2;
         s2.f<S1, &S1::f>();
     }
    

    템플릿 매개 변수 형식이 템플릿 인수와 일치하지 않기 때문에 현재 컴파일러에서 제대로 오류를 표시합니다. 매개 변수는 const 멤버의 포인터이나 f 함수는 비const입니다.The current compiler correctly gives an error, because the template parameter type doesn't match the template argument (the parameter is a pointer to a const member, but the function f is non-const):

     error C2893: Failed to specialize function template 'void S2::f(void)'note: With the following template arguments:note: 'C=S1'note: 'Function=S1::f'
    

    코드에서 이 오류를 해결하려면 사용하는 템플릿 인수 형식이 템플릿 매개 변수의 선언된 형식과 일치해야 합니다.To address this error in your code, make sure that the type of the template argument you use matches the declared type of the template parameter.

  • __declspec(align) 컴파일러는 더 이상 함수에 __declspec(align)을 허용하지 않습니다.__declspec(align) The compiler no longer accepts __declspec(align) on functions. 이는 항상 무시되었지만 현재는 컴파일러 오류가 생성됩니다.This was always ignored, but now it produces a compiler error.

     error C3323: 'alignas' and '__declspec(align)' are not allowed on function declarations
    

    이 문제를 수정하려면 함수 선언에서 __declspec(align) 을 제거합니다.To fix this problem, remove __declspec(align) from the function declaration. 아무런 영향이 없으므로 제거해도 아무것도 변경되지 않습니다.Since it had no effect, removing it does not change anything.

  • 예외 처리 예외 처리에 대해 몇 가지 변경 내용이 있습니다.Exception handling There are a couple of changes to exception handling. 먼저 예외 개체는 복사 가능하거나 이동 가능해야 합니다.First, exception objects have to be either copyable or movable. 다음 코드는 Visual Studio 2013의 Visual C++Visual C++ in Visual Studio 2013에서 컴파일되었지만 Visual Studio 2015의 Visual C++Visual C++ in Visual Studio 2015에서는 컴파일되지 않습니다.The following code compiled in Visual Studio 2013의 Visual C++Visual C++ in Visual Studio 2013, but does not compile in Visual Studio 2015의 Visual C++Visual C++ in Visual Studio 2015:

     struct S {
     public:
         S();
     private:
         S(const S &);
     };
    
     int main()
     {
         throw S(); // error
     }
    

    문제는 복사 생성자가 private이라는 점이므로 일반적인 예외 처리 과정으로는 개체를 복사할 수 없습니다.The problem is that the copy constructor is private, so the object cannot be copied as happens in the normal course of handling an exception. 복사 생성자가 explicit로 선언될 경우에도 마찬가지입니다.The same applies when the copy constructor is declared explicit.

     struct S {
         S();
         explicit S(const S &);
     };
    
     int main()
     {
         throw S(); // error
     }
    

    코드를 업데이트하려면 예외 개체에 대한 복사 생성자가 public이고 explicit로 표시되지 않아야 합니다.To update your code, make sure that the copy constructor for your exception object is public and not marked explicit.

    값으로 예외를 catch하려면 예외 개체가 복사 가능해야 합니다.Catching an exception by value also requires the exception object to be copyable. 다음 코드는 Visual Studio 2013의 Visual C++Visual C++ in Visual Studio 2013에서 컴파일되었지만 Visual Studio 2015의 Visual C++Visual C++ in Visual Studio 2015에서는 컴파일되지 않습니다.The following code compiled in Visual Studio 2013의 Visual C++Visual C++ in Visual Studio 2013, but does not compile in Visual Studio 2015의 Visual C++Visual C++ in Visual Studio 2015:

     struct B {
     public:
         B();
     private:
         B(const B &);
     };
    
     struct D : public B {
     };
    
     int main()
     {
         try
         {
         }
         catch (D d) // error
         {
         }
     }
    

    참조에 대한 catch 의 매개 변수 형식을 변경하여 이 문제를 해결할 수 있습니다.You can fix this issue by changing the parameter type for the catch to a reference.

     catch(D& d)
     {
     }
    
  • 매크로 뒤에 나오는 문자열 리터럴 컴파일러에서 사용자 정의 리터럴을 지원합니다.String literals followed by macros The compiler now supports user defined literals. 따라서 중간 공백 없이 매크로 뒤의 문자열 리터럴은 오류나 예기치 않은 결과를 생성할 수 있는 사용자 정의 리터럴로 해석됩니다.As a consequence, string literals followed by macros without any intervening whitespace are interpreted as user-defined literals, which might produce errors or unexpected results. 예를 들어 이전 컴파일러에서는 다음 코드가 성공적으로 컴파일되었습니다.For example, in previous compilers the following code compiled successfully:

     #define _x "there"
     char* func() {
         return "hello"_x;
     }
     int main()
     {
         char * p = func();
         return 0;
     }
    

    컴파일러에서 이 코드는 매크로 뒤의 문자열 리터럴 "hello"로 해석되고 “there”로 확장되었고 두 문자열 리터럴은 하나로 연결되었습니다.The compiler interpreted this as a string literal "hello" followed by a macro, which is expanded "there", and then the two string literals were concatenated into one. Visual Studio 2015의 Visual C++Visual C++ in Visual Studio 2015에서 컴파일러는 이 코드를 사용자 정의 리터럴로 해석하지만 일치하는 사용자 정의 리터럴 _x가 정의되지 않았으므로 오류가 발생합니다.In Visual Studio 2015의 Visual C++Visual C++ in Visual Studio 2015, the compiler interprets this as a user-defined literal, but since there is no matching user-defined literal _x defined, it gives an error.

     error C3688: invalid literal suffix '_x'; literal operator or literal operator template 'operator ""_x' not found
     note: Did you forget a space between the string literal and the prefix of the following string literal?
    

    이 문제를 수정하려면 문자열 리터럴과 매크로 사이에 공백을 추가합니다.To fix this problem, add a space between the string literal and the macro.

  • 인접 문자열 리터럴 이전과 마찬가지로 문자열 구문 분석과 관련된 변경으로 인해 공백이 없는 인접 문자열 리터럴(전각 또는 반각 문자 문자열 리터럴)은 Visual C++ 이전 릴리스에서 연결된 단일 문자열로 해석되었습니다.Adjacent string literals Similarly to the previous, due to related changes in string parsing, adjacent string literals (either wide or narrow character string literals) without any whitespace were interpreted as a single concatenated string in previous releases of Visaul C++. Visual Studio 2015의 Visual C++Visual C++ in Visual Studio 2015에서는 현재 두 문자열 사이에 공백을 추가해야 합니다.In Visual Studio 2015의 Visual C++Visual C++ in Visual Studio 2015, you must now add whitespace between the two strings. 예를 들어 다음 코드를 변경해야 합니다.For example, the following code must be changed:

     char * str = "abc""def";
    

    두 문자열 사이에 공백을 추가하면 됩니다.Simply add a space in between the two strings.

     char * str = "abc" "def";
    
  • placement new 및 delete delete 연산자는 C++14 표준을 준수하도록 변경되었습니다.Placement new and delete A change has been made to the delete operator in order to bring it into conformance with C++14 standard. 표준 변경에 대한 자세한 내용은 C++ 크기 지정된 할당 해제(영문)를 참조하세요.Details of the standards change can be found at C++ Sized Deallocation. 변경을 통해 size 매개 변수를 사용하는 전역 delete 연산자의 형식이 추가됩니다.The changes add a form of the global delete operator that takes a size parameter. 주요 변경 내용에 따르면 이전에는 placement new 연산자와 일치하도록 같은 서명으로 delete 연산자를 사용하면 placement new가 사용된 지점에서 컴파일러 오류(C2956)가 발생했습니다. 이 지점은 컴파일러가 해당하는 일치 delete 연산자를 식별하려고 하는 코드의 위치이기 때문입니다.The breaking change is that if you were previously using an operator delete with the same signature (to correspond with a placement new operator), you will receive a compiler error (C2956, which occurs at the point where the placement new is used, since that's the position in code where the compiler tries to identify an appropriate matching delete operator).

    void operator delete(void *, size_t) 함수는 C++11의 placement new 함수 "void * 연산자 new(size_t, size_t)"와 일치하는 placement delete 연산자였습니다.The function void operator delete(void *, size_t) was a placement delete operator corresponding to the placement new function "void * operator new(size_t, size_t)" in C++11. C++14 크기 지정된 할당 해제를 사용하면 이 delete 함수는 현재 usual deallocation 함수 (전역 delete 연산자)입니다.With C++14 sized deallocation, this delete function is now a usual deallocation function (global delete operator). 표준에 따르면 placement new를 사용하여 해당하는 delete 함수를 조회하고 usual deallocation 함수를 찾으면 프로그램에 잘못된 형식이 사용됩니다.The standard requires that if the use of a placement new looks up a corresponding delete function and finds a usual deallocation function, the program is ill-formed.

    예를 들어 코드에서 placement new 및 placement delete를 둘 다 정의한다고 가정합니다.For example, suppose your code defines both a placement new and a placement delete:

     void * operator new(std::size_t, std::size_t);
     void operator delete(void*, std::size_t) noexcept;
    

    정의한 placement delete 연산자와 새 전역 크기 지정된 delete 연산자 간에 함수 서명이 일치하기 때문에 문제가 발생합니다.The problem occurs because of the match in function signatures between a placement delete operator you've defined, and the new global sized delete operator. placement new 및 delete 연산자에 대해 size_t 이외의 다른 연산자를 사용할 수 있는지를 고려하세요.Consider whether you can use a different type other than size_t for any placement new and delete operators. size_t typedef의 형식은 컴파일러에 따라 결정되고 Visual C++에서는 부호 없는 int에 대한 typedef입니다.Note that the type of the size_t typedef is compiler-dependent; it is a typedef for unsigned int in Visual C++. 이 문제를 해결하려면 다음과 같은 열거된 형식을 사용하는 것이 좋습니다.A good solution is to use an enumerated type such as this:

     enum class my_type : size_t {};
    

    그다음에 size_t 대신 이 형식을 두 번째 인수로 사용하도록 placement new 및 delete의 정의를 변경합니다.Then, change your definition of placement new and delete to use this type as the second argument instead of size_t. placement new에 대한 호출을 업데이트하여 새 형식을 전달하고(예: static_cast<my_type> 을 사용하여 정수 값에서 변환) new 및 delete의 정의를 업데이트하여 다시 정수 형식으로 캐스팅해야 합니다.You’ll also need to update the calls to placement new to pass the new type (for example, by using static_cast<my_type> to convert from the integer value) and update the definition of new and delete to cast back to the integer type. 여기에 열거형을 사용할 필요가 없고 size_t 멤버가 있는 클래스 형식도 사용할 수 있습니다.You don’t need to use an enum for this; a class type with a size_t member would also work.

    또 다른 솔루션은 placement new를 함께 제거하는 것입니다.An alternative solution is that you might be able to eliminate the placement new altogether. 코드에서 placement new를 사용하여 placement 인수가 할당되거나 삭제되는 개체 크기와 같은 메모리 풀을 구현하면 사용자 지정 메모리 풀 코드를 바꾸는 데는 크기 지정된 할당 해제 기능이 적합할 수 있고, placement 함수를 제거하고 placement 대신에 인수가 두 개인 delete 연산자만 사용할 수 있습니다.If your code uses placement new to implement a memory pool where the placement argument is the size of the object being allocated or deleted, then sized deallocation feature might be suitable to replace your own custom memory pool code, and you can get rid of the placement functions and just use your own two-argument delete operator instead of the placement functions.

    코드를 바로 업데이트하지 않으려면 컴파일러 옵션 /Zc:sizedDealloc-를 사용하여 이전 동작으로 되돌릴 수 있습니다.If you don't want to update your code immediately, you can revert to the old behavior by using the compiler option /Zc:sizedDealloc-. 이 옵션을 사용하면 인수가 두 개인 delete 함수가 존재하지 않으므로 placement delete 연산자와 충돌하지 않습니다.If you use this option, the two-argument delete functions don’t exist and won't cause a conflict with your placement delete operator.

  • 공용 구조체 데이터 멤버Union data members

    공용 구조체의 데이터 멤버는 더 이상 참조 형식을 포함할 수 없습니다.Data members of unions can no longer have reference types. Visual Studio 2013의 Visual C++Visual C++ in Visual Studio 2013에서는 다음 코드가 성공적으로 컴파일되었지만 Visual Studio 2015의 Visual C++Visual C++ in Visual Studio 2015에서는 오류가 발생합니다.The following code compiled successfully in Visual Studio 2013의 Visual C++Visual C++ in Visual Studio 2013, but produces an error in Visual Studio 2015의 Visual C++Visual C++ in Visual Studio 2015.

     union U1 {
         const int i;
     };
     union U2 {
        int &i;
     };
     union U3 {
         struct {int &i;};
     };
    

    앞의 코드에서 발생하는 오류는 다음과 같습니다.The preceding code produces the following errors:

     test.cpp(67): error C2625: 'U2::i': illegal union member; type 'int &' is reference type
     test.cpp(70): error C2625: 'U3::i': illegal union member; type 'int &' is reference type
    

    이 문제를 해결하려면 참조 형식을 포인터 또는 값으로 변경합니다.To address this issue, change reference types either to a pointer or a value. 형식을 포인터로 변경하려면 공용 구조체 필드를 사용하는 코드를 변경해야 합니다.Changing the type to a pointer requires changes in the code that uses the union field. 코드를 값으로 변경하면 공용 구조체에 저장된 데이터가 변경되며, union 형식의 필드는 같은 메모리를 공유하므로 이 변경이 다른 필드에 영향을 미칩니다.Changing the code to a value would change the data stored in the union, which affects other fields since fields in union types share the same memory. 값 크기에 따라 공용 구조체 크기도 변경할 수 있습니다.Depending on the size of the value, it might also change the size of the union.

  • 익명 공용 구조체 이제 표준을 더 잘 준수합니다.Anonymous unions are now more conformant to the standard. 이전 컴파일러 버전에서는 익명 공용 구조체에 대한 명시적 생성자 및 소멸자를 생성했습니다.Previous versions of the compiler generated an explicit constructor and destructor for anonymous unions. 이 기능은 Visual Studio 2015의 Visual C++Visual C++ in Visual Studio 2015에서 삭제되었습니다.These are deleted in Visual Studio 2015의 Visual C++Visual C++ in Visual Studio 2015.

     struct S {
       S();
      };
    
      union {
       struct {
        S s;
       };
      } u; // C2280
    

    앞의 코드는 Visual Studio 2015의 Visual C++Visual C++ in Visual Studio 2015에서 다음 오류를 생성합니다.The preceding code generates the following error in Visual Studio 2015의 Visual C++Visual C++ in Visual Studio 2015:

     error C2280: '<unnamed-type-u>::<unnamed-type-u>(void)': attempting to reference a deleted function
     note: compiler has generated '<unnamed-type-u>::<unnamed-type-u>' here
    

    이 문제를 해결하려면 생성자 및/또는 소멸자의 정의를 제공하세요.To resolve this issue, provide your own definitions of the constructor and/or destructor.

     struct S {
     // Provide a default constructor by adding an empty function body.
     S() {}
     };
    
     union {
     struct {
     S s;
     };
     } u;
    
  • 익명 구조체가 있는 공용 구조체 공용 구조체에서 익명 구조체 멤버에 대한 런타임 동작이 표준을 준수하도록 변경되었습니다.Unions with anonymous structs In order to conform with the standard, the runtime behavior has changed for members of anonymous structures in unions. 해당 공용 구조체가 생성될 때 공용 구조체의 익명 구조체 멤버에 대한 생성자가 더 이상 암시적으로 호출되지 않습니다.The constructor for anonymous structure members in a union is no longer implicitly called when such a union is created. 또한 공용 구조체가 범위를 벗어날 때 공용 구조체의 익명 구조체 멤버에 대한 소멸자가 더 이상 암시적으로 호출되지 않습니다.Also, the destructor for anonymous structure members in a union is no longer implicitly called when the union goes out of scope. 소멸자가 있는 명명된 구조체 S 멤버가 포함된 익명 구조체가 공용 구조체 U에 들어 있는 다음 코드를 고려하세요.Consider the following code, in which a union U contains an anonymous structure that contains a member which is a named structure S that has a destructor.

     #include <stdio.h>
     struct S {
         S() { printf("Creating S\n"); }
         ~S(){ printf("Destroying S\n"); }
     };
     union U {
         struct {
         S s;
     };
         U() {}
         ~U(){}
     };
    
     void f()
     {
         U u;
         // Destructor implicitly called here.
     }
    
     int main()
     {
         f();
    
         char s[1024];
         printf("Press any key.\n");
         gets_s(s);
         return 0;
     }
    

    Visual Studio 2013의 Visual C++Visual C++ in Visual Studio 2013에서 S에 대한 생성자는 공용 구조체가 생성될 때 호출되고 S에 대한 소멸자는 f 함수의 스택이 정리될 때 호출됩니다.In Visual Studio 2013의 Visual C++Visual C++ in Visual Studio 2013, the constructor for S is called when the union is created, and the destructor for S is called when the stack for function f is cleaned up. 그러나 Visual Studio 2015의 Visual C++Visual C++ in Visual Studio 2015에서는 생성자와 소멸자가 호출되지 않습니다.But in Visual Studio 2015의 Visual C++Visual C++ in Visual Studio 2015, the constructor and destructor are not called. 컴파일러에서 이 동작 변경에 대해 경고를 표시합니다.The compiler gives a warning about this behavior change.

     warning C4587: 'U::s': behavior change: constructor is no longer implicitly calledwarning C4588: 'U::s': behavior change: destructor is no longer implicitly called
    

    원래 동작을 복원하려면 익명 구조체에 이름을 지정합니다.To restore the original behavior, give the anonymous structure a name. 익명이 아닌 구조체의 런타임 동작은 컴파일러 버전과 관계없이 동일합니다.The runtime behavior of non-anonymous structures is the same, regardless of the compiler version.

     #include <stdio.h>
    
     struct S {
         S() { printf("Creating S.\n"); }
         ~S() { printf("Destroying S\n"); }
     };
     union U {
         struct {
             S s;
         } namedStruct;
         U() {}
         ~U() {}
     };
    
     void f()
     {
         U u;
     }
    
     int main()
     {
         f();
    
         char s[1024];
         printf("Press any key.\n");
         gets_s(s);
         return 0;
     }
    

    또는 생성자 및 소멸자 코드를 새 함수로 이동하고 공용 구조체에 대한 생성자 및 소멸자에서 이들 함수에 호출을 추가하세요.Alternatively, try moving the constructor and destructor code into new functions, and add calls to these functions from the constructor and destructor for the union.

     #include <stdio.h>
    
     struct S {
         void Create() { printf("Creating S.\n"); }
         void Destroy() { printf("Destroying S\n"); }
     };
     union U {
         struct {
             S s;
         };
         U() { s.Create();  }
         ~U() { s.Destroy(); }
     };
    
     void f()
     {
         U u;
     }
    
     int main()
     {
         f();
    
     char s[1024];
     printf("Press any key.\n");
     gets_s(s);
     return 0;
     }
    
  • 템플릿 확인 템플릿 이름 확인이 변경되었습니다.Template resolution Changes have been made to name resolution for templates. C++에서 이름을 확인할 후보를 고려할 때 잠재적인 일치 항목으로 고려 중인 하나 이상의 이름에서 잘못된 템플릿 인스턴스화가 생성될 수 있습니다.In C++, when considering candidates for the resolution of a name, it can be the case that one or more names under consideration as potential matches produces an invalid template instantiation. 보통 이들 잘못된 인스턴스화 때문에 컴파일러 오류가 발생하지는 않습니다. 이 원칙을 SFINAE(Substitution Failure Is Not An Error)라고 합니다.These invalid instantiations do not normally cause compiler errors, a principle which is known as SFINAE (Substitution Failure Is Not An Error).

    현재 SFINAE에 따라 컴파일러가 클래스 템플릿의 특수화를 인스턴스화해야 하면 이 프로세스 중에 발생하는 오류는 컴파일러 오류입니다.Now, if SFINAE requires the compiler to instantiate the specialization of a class template, then any errors that occur during this process are compiler errors. 이전 버전에서는 컴파일러가 해당 오류를 무시합니다.In previous versions, the compiler would ignore such errors. 예를 들어, 다음 코드를 고려하세요.For example, consider the following code:

     #include <type_traits>
    
     template<typename T>
     struct S
     {
     S() = default;
     S(const S&);
     S(S&&);
    
     template<typename U, typename = typename std::enable_if<std::is_base_of<T, U>::value>::type>
     S(S<U>&&);
     };
    
     struct D;
    
     void f1()
     {
     S<D> s1;
         S<D> s2(s1);
     }
    
     struct B
     {
     };
    
     struct D : public B
     {
     };
    
     void f2()
     {
     S<D> s1;
         S<D> s2(s1);
     }
    

    현재 컴파일러로 컴파일할 경우 다음 오류가 발생합니다.If you compile with the current compiler, you get the following error:

     type_traits(1110): error C2139: 'D': an undefined class is not allowed as an argument to compiler intrinsic type trait '__is_base_of'
     ..\t331.cpp(14): note: see declaration of 'D'
     ..\t331.cpp(10): note: see reference to class template instantiation 'std::is_base_of<T,U>' being compiled
             with
             [
                 T=D,
                 U=D
             ]
    

    이는 is_base_of의 첫 번째 호출 지점에서 'D' 클래스가 아직 정의되지 않았기 때문입니다.This is because at the point of the first invocation of the is_base_of the class 'D' has not yet been defined.

    이 경우 문제를 해결하려면 클래스가 정의될 때까지 이러한 형식 특성을 사용하지 마세요.In this case, the fix is not to use such type traits until the class has been defined. B 및 D의 정의를 코드 파일의 시작 부분으로 이동하면 오류가 해결됩니다.If you move the definitions of B and D to the beginning of the code file, the error is resolved. 정의가 헤더 파일에 있으면 헤더 파일의 include 문 순서를 확인하여 문제가 있는 템플릿이 사용되기 전에 클래스 정의가 컴파일되는지 확인합니다.If the definitions are in header files, check the order of the include statements for the header files to make sure that any class definitions are compiled before the problematic templates are used.

  • 복사 생성자 Visual Studio 2013Visual Studio 2013 및 Visual Studio 2015에서 클래스에 사용자 정의 이동 생성자가 있지만 사용자 정의 복사 생성자가 없는 경우 컴파일러는 해당 클래스에 대한 복사 생성자를 생성합니다.Copy constructors In both Visual Studio 2013Visual Studio 2013 and Visual Studio 2015, the compiler generates a copy constructor for a class if that class has a user-defined move constructor but no user-defined copy constructor. Dev14에서는 생성된 복사 생성자가 "= delete"로 표시됩니다.In Dev14, this implicitly generated copy constructor is also marked "= delete".

Visual Studio 2015 업데이트 1의 규칙 향상Conformance Improvements in Visual Studio 2015 Update 1

  • 개인 가상 기본 클래스 및 간접 상속 이전 버전의 컴파일러는 파생 클래스에서 간접적으로 파생된 private virtual 기본 클래스의 멤버 함수를 호출할 수 있었습니다.Private virtual base classes and indirect inheritance Previous versions of the compiler allowed a derived class to call member functions of its indirectly-derivedprivate virtual base classes. 이 이전 동작은 올바르지 않으며 C++ 표준을 따르지 않습니다.This old behavior was incorrect and does not conform to the C++ standard. 컴파일러는 이러한 방식으로 작성된 코드를 더 이상 허용하지 않으며, 결과적으로 컴파일러 오류 C2280이 발생합니다.The compiler no longer accepts code written in this way and issues compiler error C2280 as a result.

     error C2280: 'void *S3::__delDtor(unsigned int)': attempting to reference a deleted function
    

    예제(이전)Example (before)

     class base
     {
     protected:
         base();
         ~base();
     };
    
     class middle: private virtual base {};class top: public virtual middle {};
    
     void destroy(top *p)
     {
         delete p;  //
     }
    

    예제(이후)Example (after)

     class base;  // as above
    
     class middle: protected virtual base {};
     class top: public virtual middle {};
    
     void destroy(top *p)
     {
         delete p;
     }
    

    또는-or-

     class base;  // as above
    
     class middle: private virtual base {};
     class top: public virtual middle, private virtual bottom {};
    
     void destroy(top *p)
     {
         delete p;
     }
    
  • 오버로드된 operator new 및 operator delete 이전 버전의 컴파일러는 비멤버 operator new 및 비멤버 operator delete를 정적으로 선언하고 전역 네임스페이스 이외의 네임스페이스에서 선언할 수 있었습니다.Overloaded operator new and operator delete Previous versions of the compiler allowed non-member operator new and non-member operator delete to be declared static, and to be declared in namespaces other than the global namespace. 이 이전 동작은 프로그램에서 프로그래머가 의도한 new 또는 delete 연산자 구현을 호출하지 않아서 잘못된 자동 런타임 동작이 발생하는 위험을 초래했습니다.This old behavior created a risk that the program would not call the new or delete operator implementation that the programmer intended, resulting in silent bad runtime behavior. 컴파일러는 이러한 방식으로 작성된 코드를 더 이상 허용하지 않으며, 대신 컴파일러 오류 C2323이 발생합니다.The compiler no longer accepts code written in this way and issues compiler error C2323 instead.

     error C2323: 'operator new': non-member operator new or delete functions may not be declared static or in a namespace other than the global namespace.
    

    예제(이전)Example (before)

     static inline void * __cdecl operator new(size_t cb, const std::nothrow_t&)  // error C2323
    

    예제(이후)Example (after)

     void * __cdecl operator new(size_t cb, const std::nothrow_t&)  // removed 'static inline'
    
    Additionally, although the compiler doesn't give a specific diagnostic, inline operator new is considered ill-formed.
    
  • 비클래스 형식에서 'operator type()'(사용자 정의 변환) 호출 이전 버전의 컴파일러는 'operator type()'을 자동으로 무시하면서 비클래스 형식에서 호출할 수 있었습니다.Calling 'operator type()' (user-defined conversion) on non-class types Previous versions of the compiler allowed 'operator type()' to be called on non-class types while silently ignoring it. 이 이전 동작으로 잘못된 코드가 자동으로 생성되어 예기치 않은 런타임 동작이 발생하는 위험이 초래되었습니다.This old behavior created a risk of silent bad code generation, resulting in unpredictable runtime behavior. 컴파일러는 이러한 방식으로 작성된 코드를 더 이상 허용하지 않으며, 대신 컴파일러 오류 C2228이 발생합니다.The compiler no longer accepts code written in this way and issues compiler error C2228 instead.

     error C2228: left of '.operator type' must have class/struct/union
    

    예제(이전)Example (before)

     typedef int index_t;
    
     void bounds_check(index_t index);
    
     void login(int column)
     {
         bounds_check(column.operator index_t());  // error C2228
     }
    

    예제(이후)Example (after)

     typedef int index_t;
    
     void bounds_check(index_t index);
    
     void login(int column)
     {
          bounds_check(column);  // removed cast to 'index_t', 'index_t' is an alias of 'int'
     }
    
  • 상세 형식 지정자의 중복 typename 이전 버전의 컴파일러는 상세 형식 지정자에 typename이 허용되었습니다. 이러한 방식으로 작성된 코드는 의미 체계상 잘못되었습니다.Redundant typename in elaborated type specifiers Previous versions of the compiler allowed typename in an elaborated type specifiers; code written in this way is semantically incorrect. 컴파일러는 이러한 방식으로 작성된 코드를 더 이상 허용하지 않으며, 대신 컴파일러 오류 C3406이 발생합니다.The compiler no longer accepts code written in this way and issues compiler error C3406 instead.

     error C3406: 'typename' cannot be used in an elaborated type specifier
    

    예제(이전)Example (before)

     template <typename class T>
     class container;
    

    예제(이후)Example (after)

     template <class T>  // alternatively, could be 'template <typename T>'; 'typename' is not elaborating a type specifier in this case
     class container;
    
  • 이니셜라이저 목록에서 배열의 형식 추론 이전 버전의 컴파일러는 이니셜라이저 목록에서 배열의 형식 추론을 지원하지 않았습니다.Type deduction of arrays from an initializer list Previous versions of the compiler did not support type deduction of arrays from an initializer list. 이제 컴파일러가 이러한 형태의 형식 추론을 지원합니다. 결과적으로 이니셜라이저 목록을 사용한 함수 템플릿 호출은 이제 모호하거나 이전 버전의 컴파일러와 다른 오버로드가 선택될 수 있습니다.The compiler now supports this form of type deduction and, as a result, calls to function templates using initializer lists might now be ambiguous or a different overload might be chosen than in previous versions of the compiler. 이러한 문제를 해결하려면 이제 프로그램에서 프로그래머가 의도한 오버로드를 명시적으로 지정해야 합니다.To resolve these issues, the program must now explicitly specify the overload that the programmer intended.

    이 새로운 동작으로 오버로드 확인에서 기록 후보와 똑같이 우수한 추가 후보를 고려하게 되는 경우, 호출이 모호해지며 결과적으로 컴파일러에서 컴파일러 오류 C2668이 발생합니다.When this new behavior causes overload resolution to consider an additional candidate that is equally as good as the historic candidate, the call becomes ambiguous and the compiler issues compiler error C2668 as a result.

     error C2668: 'function' : ambiguous call to overloaded function.
    

    예제 1: 오버로드된 함수에 대한 호출이 모호합니다(이전).Example 1: Ambiguous call to overloaded function (before)

     // In previous versions of the compiler, code written in this way would unambiguously call f(int, Args...)
     template <typename... Args>
     void f(int, Args...);  //
    
     template <int N, typename... Args>
     void f(const int (&)[N], Args...);
    
     int main()
     {
         // The compiler now considers this call ambiguous, and issues a compiler error
         f({3});  error C2668: 'f' ambiguous call to overloaded function
     }
    

    예제 1: 오버로드된 함수에 대한 호출이 모호합니다(이후).Example 1: ambiguous call to overloaded function (after)

     template <typename... Args>
     void f(int, Args...);  //
    
     template <int N, typename... Args>
     void f(const int (&)[N], Args...);
    
     int main()
     {
         // To call f(int, Args...) when there is just one expression in the initializer list, remove the braces from it.
         f(3);
     }
    

    이 새로운 동작으로 오버로드 확인에서 기록 후보보다 더 일치되는 추가 후보를 고려하게 되는 경우, 호출이 새 후보로 명확하게 확인되므로 프로그래머가 의도한 것과 다른 프로그램 동작 변경을 초래할 수 있습니다.When this new behavior causes overload resolution to consider an additional candidate that is a better match than the historic candidate, the call resolves unambiguously to the new candidate, causing a change in program behavior that is probably different than the programmer intended.

    예제 2: 오버로드 확인의 변경(이전)Example 2: change in overload resolution (before)

     // In previous versions of the compiler, code written in this way would unambiguously call f(S, Args...)
     struct S
     {
         int i;
         int j;
     };
    
     template <typename... Args>
     void f(S, Args...);
    
     template <int N, typename... Args>
     void f(const int *&)[N], Args...);
    
     int main()
     {
         // The compiler now resolves this call to f(const int (&)[N], Args...) instead
         f({1, 2});
     }
    

    예제 2: 오버로드 확인의 변경(이후)Example 2: change in overload resolution (after)

     struct S;  // as before
    
     template <typename... Args>
     void f(S, Args...);
    
     template <int N, typename... Args>
     void f(const int *&)[N], Args...);
    
     int main()
     {
         // To call f(S, Args...), perform an explicit cast to S on the initializer list.
         f(S{1, 2});
     }
    
  • switch 문 경고의 복원 이전 버전의 컴파일러는 switch 문과 관련된 기존 경고를 제거했습니다. 이제 이러한 경고가 복원되었습니다.Restoration of switch statement warnings A Previous version of the compiler removed previously-existing warnings related to switch statements; these warnings have now been restored. 이제 컴파일러에서 복원된 경고가 발생합니다. 이제 특정 사례(기본 사례 포함)와 관련된 경고가 switch 문의 마지막 줄 대신, 잘못된 사례가 포함된 줄에서 발생합니다.The compiler now issues the restored warnings, and warnings related to specific cases (including the default case) are now issued on the line containing the offending case, rather than on the last line of the switch statement. 이제 과거와는 다른 줄에서 해당 경고가 발생하므로 이전에 #pragma warning(disable:####) 을 사용하면 표시되지 않았던 경고가 더 이상 의도한 대로 숨겨지지 않을 수 있습니다.As a result of now issuing those warnings on different lines than in the past, warnings previously suppressed by using #pragma warning(disable:####) may no longer be suppressed as intended. 이러한 경고를 의도한 대로 표시하지 않으려면 #pragma warning(disable:####) 지시문을 잠재적으로 잘못된 첫 번째 사례 위의 줄로 이동해야 할 수 있습니다.To suppress these warnings as intended, it might be necessary to move the #pragma warning(disable:####) directive to a line above the first potentially-offending case. 다음은 복원된 경고입니다.The following are the restored warnings.

     warning C4060: switch statement contains no 'case' or 'default' labels
    
     warning C4061: enumerator 'bit1' in switch of enum 'flags' is not explicitly handled by a case label
    
     warning C4062: enumerator 'bit1' in switch of enum 'flags' is not handled
    
     warning C4063: case 'bit32' is not a valid value for switch of enum 'flags'
    
     warning C4064: switch of incomplete enum 'flags'
    
     warning C4065: switch statement contains 'default' but no 'case' labels
    
     warning C4808: case 'value' is not a valid value for switch condition of type 'bool'
    
     Warning C4809: switch statement has redundant 'default' label; all possible 'case' labels are given
    

    C4063의 예제(이전)Example of C4063 (before)

     class settings
     {
     public:
         enum flags
         {
             bit0 = 0x1,
             bit1 = 0x2,
             ...
         };
         ...
     };
    
     int main()
     {
         auto val = settings::bit1;
    
         switch (val)
         {
         case settings::bit0:
             break;
    
         case settings::bit1:
             break;
    
         case settings::bit0 | settings::bit1:  // warning C4063
             break;
         }
     };
    

    C4063의 예제(이후)Example of C4063 (after)

     class settings {...};  // as above
    
     int main()
     {
         // since C++11, use std::underlying_type to determine the underlying type of an enum
         typedef std::underlying_type<settings::flags>::type flags_t;
    
         auto val = settings::bit1;
    
         switch (static_cast<flags_t>(val))
         {
         case settings::bit0:
             break;
    
         case settings::bit1:
             break;
    
         case settings::bit0 | settings::bit1:  // ok
             break;
         }
     };
    

    복원된 다른 경고의 예는 해당 설명서에 제공됩니다.Examples of the other restored warnings are provided in their documentation.

  • #include: 경로 이름에 부모 디렉터리 지정자 '..' 사용 (/Wall /WX에만 영향을 줌)#include: use of parent-directory specifier '..' in pathname (only affects /Wall /WX)

    이전 버전의 컴파일러에서는Previous versions of the compiler did not detect the use of the parent-directory specifier '..' #include 지시문의 경로 이름에서 부모 디렉터리 지정자('..')의 사용을 검색하지 못했습니다.in the pathname of #include directives. 이러한 방식으로 작성된 코드는 일반적으로 프로젝트 상대 경로를 부정확하게 사용하여 프로젝트의 외부에 존재하는 헤더를 포함합니다.Code written in this way is usually intended to include headers that exist outside of the project by incorrectly using project-relative paths. 이 이전 동작은 프로그램이 프로그래머가 의도한 것과 다른 소스 파일을 포함하여 컴파일되거나 이러한 상대 경로가 다른 빌드 환경으로 이식되지 않는 위험을 초래했습니다.This old behavior created a risk that the program could be compiled by including a different source file than the programmer intended, or that these relative paths would not be portable to other build environments. 이제 컴파일러는 이러한 방식으로 작성된 코드를 검색하여 프로그래머에게 알립니다. 그리고 사용하도록 설정된 경우 선택적으로 컴파일러 경고 C4464가 발생합니다.The compiler now detects and notifies the programmer of code written in this way and issues an optional compiler warning C4464, if enabled.

     warning C4464: relative include path contains '..'
    

    예제(이전)Example (before)

     #include "..\headers\C4426.h"  // emits warning C4464
    

    예제(이후)Example (after)

     #include "C4426.h"  // add absolute path to 'headers\' to your project's include directories
    

    또한 컴파일러가 특정 진단을 제공하지는 않지만, 프로젝트의 Include 디렉터리를 지정하는 데 부모 디렉터리 지정자("..")를 사용하지 않는 것이 좋습니다.Additionally, although the compiler does not give a specific diagnostic, we also recommend that the parent-directory specifier ".." should note be used to specify your project's include directories.

  • #pragma optimize()에서 헤더 파일의 끝을 넘어 확장 (/Wall /WX에만 영향을 줌)#pragma optimize() extends past end of header file (only affects /Wall /WX)

    이전 버전의 컴파일러에서는 변환 단위 내에 포함된 헤더 파일을 이스케이프하는 최적화 플래그 설정에 대한 변경 내용을 검색하지 못했습니다.Previous versions of the compiler did not detect changes to optimization flag settings that escape a header file included within a translation unit. 이제 컴파일러는 이러한 방식으로 작성된 코드를 검색하여 프로그래머에게 알립니다. 그리고 사용하도록 설정된 경우 잘못된 #include의 위치에서 선택적으로 컴파일러 경고 C4426이 발생합니다.The compiler now detects and notifies the programmer of code written in this way and issues an optional compiler warning C4426 at the location of the offending #include, if enabled. 이 경고는 변경 내용이 명령줄 인수에 의해 컴파일러에 설정된 최적화 플래그와 충돌하는 경우에만 발생합니다.This warning is only issued if the changes conflict with the optimization flags set by command-line arguments to the compiler.

     warning C4426: optimization flags changed after including header, may be due to #pragma optimize()
    

    예제(이전)Example (before)

     // C4426.h
     #pragma optimize("g", off)
     ...
     // C4426.h ends
    
     // C4426.cpp
     #include "C4426.h"  // warning C4426
    

    예제(이후)Example (after)

     // C4426.h
     #pragma optimize("g", off)
     ...
     #pragma optimize("", on)  // restores optimization flags set via command-line arguments
     // C4426.h ends
    
     // C4426.cpp
     #include "C4426.h"
    
  • #pragma warning(push)#pragma warning(pop) (/Wall /WX에만 영향을 줌)Mismatched #pragma warning(push) and #pragma warning(pop) (only affects /Wall /WX)

    이전 버전의 컴파일러는 다른 소스 파일에서 #pragma warning(push) 상태 변경이 #pragma warning(pop) 상태 변경과 쌍을 이루는 것(의도되는 경우가 드묾)을 검색하지 못했습니다.Previous versions of the compiler did not detect #pragma warning(push) state changes being paired with #pragma warning(pop) state changes in a different source file, which is rarely intended. 이 이전 동작으로 프로그램이 프로그래머가 의도한 것과 다르게 설정된 경고 집합으로 컴파일되어 잘못된 자동 런타임 동작이 발생하는 위험이 초래됩니다.This old behavior created a risk that the program would be compiled with a different set of warnings enabled than the programmer intended, possibly resulting in silent bad runtime behavior. 이제 컴파일러는 이러한 방식으로 작성된 코드를 검색하여 프로그래머에게 알립니다. 그리고 사용하도록 설정된 경우 일치하는 #pragma warning(pop)의 위치에서 선택적으로 컴파일러 경고 C5031이 발생합니다.The compiler now detects and notifies the programmer of code written in this way and issues an optional compiler warning C5031 at the location of the matching #pragma warning(pop), if enabled. 이 경고에는 해당 #pragma warning(push)의 위치를 참조하는 참고가 포함되어 있습니다.This warning includes a note referencing the location of the corresponding #pragma warning(push).

     warning C5031: #pragma warning(pop): likely mismatch, popping warning state pushed in different file
    

    예제(이전)Example (before)

     // C5031_part1.h
     #pragma warning(push)
     #pragma warning(disable:####)
     ...
     // C5031_part1.h ends without #pragma warning(pop)
    
     // C5031_part2.h
     ...
     #pragma warning(pop)  // pops a warning state not pushed in this source file
     ...
     // C5031_part1.h ends
    
     // C5031.cpp
     #include "C5031_part1.h" // leaves #pragma warning(push) 'dangling'
     ...
     #include "C5031_part2.h" // matches 'dangling' #pragma warning(push), resulting in warning C5031
     ...
    

    예제(이후)Example (after)

     // C5031_part1.h
     #pragma warning(push)
     #pragma warning(disable:####)
     ...
     #pragma warning(pop)  // pops the warning state pushed in this source file
     // C5031_part1.h ends without #pragma warning(pop)
    
     // C5031_part2.h
     #pragma warning(push)  // pushes the warning state pushed in this source file
     #pragma warning(disable:####)
     ...
     #pragma warning(pop)
     // C5031_part1.h ends
    
     // C5031.cpp
     #include "C5031_part1.h" // #pragma warning state changes are self-contained and independent of other source files or their #include order.
     ...
     #include "C5031_part2.h"
     ...
    

    드물긴 하지만 의도적으로 이러한 코드를 작성하는 경우가 있습니다.Though uncommon, code written in this way is sometimes intentional. 이러한 방식으로 작성된 코드는 #include 순서의 변경에 민감합니다. 가능한 경우 소스 코드 파일에서 자동으로 포함된 방식으로 경고 상태를 관리하는 것이 좋습니다.Code written in this way is sensitive to changes in #include order; when possible, we recommend that source code files manage warning state in a self-contained way.

  • #pragma warning(push) 불일치(/Wall /WX에만 해당) 이전 버전의 컴파일러는 변환 단위의 끝에서 일치하지 않는 #pragma warning(push) 상태 변경을 검색하지 못했습니다.Unmatched #pragma warning(push) (only affects /Wall /WX) Previous versions of the compiler did not detect unmatched #pragma warning(push) state changes at the end of a translation unit. 이제 컴파일러는 이러한 방식으로 작성된 코드를 검색하여 프로그래머에게 알립니다. 그리고 사용하도록 설정된 경우 일치하지 않는 #pragma warning(push)의 위치에서 선택적으로 컴파일러 경고 C5032가 발생합니다.The compiler now detects and notifies the programmer of code written in this way and issues an optional compiler warning C5032 at the location of the unmatched #pragma warning(push), if enabled. 이 경고는 변환 단위에 컴파일 오류가 없는 경우에만 발생합니다.This warning is only issued if there are no compilation errors in the translation unit.

     warning C5032: detected #pragma warning(push) with no corresponding #pragma warning(pop)
    

    예제(이전)Example (before)

     // C5032.h
     #pragma warning(push)
     #pragma warning(disable:####)
     ...
     // C5032.h ends without #pragma warning(pop)
    
     // C5032.cpp
     #include "C5032.h"
     ...
     // C5032.cpp ends -- the translation unit is completed without #pragma warning(pop), resulting in warning C5032 on line 1 of C5032.h
    

    예제(이후)Example (after)

     // C5032.h
     #pragma warning(push)
     #pragma warning(disable:####)
     ...
     #pragma warning(pop) // matches #pragma warning (push) on line 1
     // C5032.h ends
    
     // C5032.cpp
     #include "C5032.h"
     ...
     // C5032.cpp ends -- the translation unit is completed without unmatched #pragma warning(push)
    
  • 향상된 #pragma 경고 상태 추적의 결과로 추가 경고가 발생할 수 있음 이전 버전의 컴파일러는 #pragma 경고 상태 변경을 추적하여 의도된 모든 경고를 발생시키는 데 충분하지 못했습니다.Additional warnings might be issued as a result of improved #pragma warning state tracking Previous versions of the compiler tracked #pragma warning state changes insufficiently well to issue all intended warnings. 이 동작으로 프로그래머가 의도한 것과 다른 상황에서 특정 경고가 효과적으로 표시되지 않는 위험이 초래됩니다.This behavior created a risk that certain warnings would be effectively suppressed in circumstances different than the programmer intended. 이제 컴파일러는 #pragma warning 상태(특히 템플릿 내부의 #pragma warning 상태 변경과 관련된 내용)를 더욱 강력하게 추적하며, 선택적으로 새로운 경고 C5031 및 C5032가 발생합니다. 이러한 경고는 프로그래머가 #pragma warning(push)#pragma warning(pop)의 의도하지 않은 사용을 찾는 데 도움이 됩니다.The compiler now tracks #pragma warning state more robustly -- especially related to #pragma warning state changes inside of templates -- and optionally issues new warnings C5031 and C5032 which are intended to help the programmer locate unintended uses of #pragma warning(push) and #pragma warning(pop).

    개선된 #pragma warning 상태 변경 추적의 결과로, 이전에 제대로 표시되지 않은 경고 또는 이전에 잘못 진단된 문제와 관련된 경고가 이제 발생할 수 있습니다.As a result of improved #pragma warning state change tracking, warnings formerly incorrectly suppressed or warnings related to issues formerly misdiagnosed might now be issued.

  • 연결할 수 없는 코드의 향상된 식별 C++표준 라이브러리가 변경되고 이전 버전의 컴파일러를 통한 인라인 함수 호출이 향상됨으로써 컴파일러에서 특정 코드에 연결할 수 없음을 증명할 수 있게 되었습니다.Improved identification of unreachable code C++ Standard Library changes and improved ability to inline function calls over previous versions of the compiler might allow the compiler to prove that certain code is now unreachable. 이 새로운 동작으로 경고 C4720의 인스턴스가 새로 그리고 더욱 자주 발생할 수 있습니다.This new behavior can result in new and more-frequently issued instances of warning C4720.

     warning C4720: unreachable code
    

    최적화 프로세스에서 더 많은 함수 호출을 인라인하거나 중복 코드를 제거하거나 특정 코드에 접근할 수 없는지 확인할 수 있도록 하므로, 이 경고는 대개 최적화를 사용하면서 컴파일할 경우에만 발생할 수 있습니다.In many cases, this warning might only be issued when compiling with optimizations enabled, since optimizations may inline more function calls, eliminate redundant code, or otherwise make it possible to determine that certain code is unreachable. 경고 C4720의 새 인스턴스가 특히 std::find의 사용과 관련하여 try/catch 블록에서 자주 발생했음을 관찰했습니다.We have observed that new instances of warning C4720 have frequently occurred in try/catch blocks, especially in relation to use of std::find.

    예제(이전)Example (before)

     try
     {
         auto iter = std::find(v.begin(), v.end(), 5);
     }
     catch(...)
     {
         do_something();  // ok
     }
    

    예제(이후)Example (after)

     try
     {
         auto iter = std::find(v.begin(), v.end(), 5);
     }
     catch(...)
     {
         do_something();  // warning C4702: unreachable code
     }
    

Visual Studio 2015 업데이트 2의 규칙 향상Conformance Improvements in Visual Studio 2015 Update 2

  • SFINAE 식에 대한 부분적 지원으로 인해 추가 경고 및 오류가 발생할 수 있음 이전 버전의 컴파일러는 SFINAE 식에 대한 지원이 부족하여 decltype 지정자 내에서 특정 종류의 식을 구문 분석하지 못했습니다.Additional warnings and errors might be issued as a result of partial support for expression SFINAE Previous versions of the compiler did not parse certain kinds of expressions inside decltype specifiers due to lack of support for expression SFINAE. 이 이전 동작은 올바르지 않으며 C++ 표준을 따르지 않습니다.This old behavior was incorrect and does not conform to the C++ standard. 지속적인 규칙 향상으로 인해 이제 컴파일러는 이러한 식을 구문 분석하고 SFINAE 식에 대한 부분 지원을 합니다.The compiler now parses these expressions and has partial support for expression SFINAE due to ongoing conformance improvements. 결과적으로 이제 컴파일러는 이전 버전의 컴파일러가 구문 분석하지 않았던 식에서 경고 및 오류를 발생합니다.As a result, the compiler now issues warnings and errors found in expressions that previous versions of the compiler did not parse.

    이 새로운 동작이 아직 선언되지 않은 형식을 포함하는 decltype 식을 구문 분석할 때, 컴파일러는 결과적으로 오류 C2039를 발생합니다.When this new behavior parses a decltype expression that includes a type that has not yet been declared, the compiler issues compiler error C2039 as a result.

     error C2039: 'type': is not a member of '`global namespace''
    

    예제 1: 선언되지 않은 형식 사용(이전)Example 1: use of an undeclared type (before)

     struct s1
     {
       template <typename T>
       auto f() -> decltype(s2<T>::type::f());  // error C2039
    
       template<typename>
       struct s2 {};
     }
    

    예제 1(이후)Example 1 (after)

     struct s1
     {
       template <typename>  // forward declare s2struct s2;
    
       template <typename T>
       auto f() -> decltype(s2<T>::type::f());
    
       template<typename>
       struct s2 {};
     }
    

    이 새로운 동작이 종속 이름이 형식임을 지정하기 위해 필요한 typename 키워드 사용이 누락된 decltype 식을 구문 분석할 때 컴파일러는 컴파일러 오류 C2923과 함께 컴파일러 경고 C4346을 발생합니다.When this new behavior parses a decltype expression that is missing a necessary use of the typename keyword to specify that a dependent name is a type, the compiler issues compiler warning C4346 together with compiler error C2923.

     warning C4346: 'S2<T>::Type': dependent name is not a type
    
     error C2923: 's1': 'S2<T>::Type' is not a valid template type argument for parameter 'T'
    

    예제 2: 종속 이름이 형식이 아님(이전)Example 2: dependent name is not a type (before)

     template <typename T>
     struct s1
     {
       typedef T type;
     };
    
     template <typename T>
     struct s2
     {
       typedef T type;
     };
    
     template <typename T>
     T declval();
    
     struct s
     {
       template <typename T>
       auto f(T t) -> decltype(t(declval<S1<S2<T>::type>::type>()));  // warning C4346, error C2923
     };
    

    예제 2(이후)Example 2 (after)

     template <typename T> struct s1 {...};  // as above
     template <typename T> struct s2 {...};  // as above
    
     template <typename T>
     T declval();
    
     struct s
     {
       template <typename T>
       auto f(T t) -> decltype(t(declval<S1<typename S2<T>::type>::type>()));
     };
    
  • volatile 멤버 변수에서 암시적으로 정의된 생성자와 대입 연산자를 차단 이전 버전의 컴파일러는 volatile 멤버 변수가 있는 클래스에서 기본 복사/이동 생성자 및 기본 복사/이동 대입 연산자를 자동으로 생성할 수 있도록 했습니다.volatile member variables prevent implicitly defined constructors and assignment operators Previous versions of the compiler allowed a class that has volatile member variables to have default copy/move constructors and default copy/move assignment operators automatically generated. 이 이전 동작은 올바르지 않으며 C++ 표준을 따르지 않습니다.This old behavior was incorrect and does not conform to the C++ standard. 이제 컴파일러는 volatile 멤버 변수가 있는 클래스는 특수한 생성자 및 대입 연산자가 있는 것으로 간주하여 이러한 연산자의 기본 구현이 자동으로 생성되는 것을 막습니다.The compiler now considers a class that has volatile member variables to have non-trivial construction and assignment operators which prevents default implementations of these operators from being automatically generated. 이러한 클래스가 공용 구조체(또는 클래스 내의 익명 공용 구조체)의 멤버이면 공용 구조체(또는 익명 공용 구조체를 포함하는 클래스)의 복사/이동 생성자 및 복사/이동 대입 연산자는 삭제된 것으로 암시적으로 정의됩니다.When such a class is a member of a union (or an anonymous union inside of a class), the copy/move constructors and copy/move assignment operators of the union (or the class containing the unonymous union) will be implicitly defined as deleted. 명시적으로 정의하지 않고 공용 구조체(또는 익명 공용 구조체를 포함하는 클래스)를 만들거나 복사하려 하면 오류가 발생하며 컴파일러에서 결과적으로 컴파일러 오류 C2280을 발생합니다.Attempting to construct or copy the union (or class containing the anonymous union) without explicitly defining them is an error and the compiler issues compiler error C2280 as a result.

     error C2280: 'B::B(const B &)': attempting to reference a deleted function
    

    예제(이전)Example (before)

     struct A
     {
       volatile int i;
       volatile int j;
     };
    
     extern A* pa;
    
     struct B
     {
       union
       {
         A a;
         int i;
       };
     };
    
     B b1 {*pa};
     B b2 (b1);  // error C2280
    

    예제(이후)Example (after)

     struct A
     {
       int i;int j;
     };
    
     extern volatile A* pa;
    
     A getA()  // returns an A instance copied from contents of pa
     {
       A a;
       a.i = pa->i;
       a.j = pa->j;
       return a;
     }
    
     struct B;  // as above
    
     B b1 {GetA()};
     B b2 (b1);  // error C2280
    
  • 정적 멤버 함수는 cv 한정자를 지원하지 않습니다.Static member functions do not support cv-qualifiers. 이전 버전의 Visual C++ 2015는 정적 멤버 함수에 cv 한정자가 포함되는 것을 허용했습니다.Previous versions of Visual C++ 2015 allowed static member functions to have cv-qualifiers. 이 동작은 Visual C++ 2015 및 Visual C++ 2015 업데이트 1에서의 문제 재발로 인한 것입니다. Visual C++ 2013 및 이전 버전의 Visual C++는 이런 식으로 작성된 코드를 거부합니다.This behavior is due to a regression in Visual C++ 2015 and Visual C++ 2015 Update 1; Visual C++ 2013 and previous versions of Visual C++ reject code written in this way. Visual C++ 2015 및 Visual C++ 2015 업데이트 1의 동작은 잘못되었으며 C++ 표준과 일치하지 않습니다.The behavior of Visual C++ 2015 and Visual C++ 2015 Update 1 is incorrect and does not conform to the C++ standard. Visual Studio 2015 업데이트 2는 이런 식으로 작성된 코드를 거부하며 대신 컴파일러 오류 C2511을 발생합니다.Visual Studio 2015 Update 2 rejects code written in this way and issues compiler error C2511 instead.

     error C2511: 'void A::func(void) const': overloaded member function not found in 'A'
    

    예제(이전)Example (before)

     struct A
     {
       static void func();
     };
    
     void A::func() const {}  // C2511
    

    예제(이후)Example (after)

     struct A
     {
       static void func();
     };
    
     void A::func() {}  // removed const
    
  • 열거형의 정방향 선언은 WinRT 코드에서 허용되지 않음(/ZW에만 해당) /clr 컴파일러 스위치를 사용하여 컴파일된 .Net Framework용 관리되는 C++ 코드와 마찬가지로, 컴파일된 WinRT(Windows 런타임)용 코드에서는 enum 형식을 정방향 선언할 수 없습니다.Forward declaration of enum is not allowed in WinRT code (affects /ZW only) Code compiled for the Windows Runtime (WinRT) doesn't allow enum types to be forward declared, similarly to when managed C++ code is compiled for the .Net Framework using the /clr compiler switch. 이 동작은 열거형의 크기를 항상 알 수 있으며 WinRT 형식 시스템에 올바르게 프로젝션될 수 있음을 확인합니다.This behavior is ensures that the size of an enumeration is always known and can be correctly projected to the WinRT type system. 컴파일러는 이러한 방식으로 작성된 코드를 거부하고 컴파일러 오류 C3197과 함께 컴파일러 오류 C2599를 발생합니다.The compiler rejects code written in this way and issues compiler error C2599 together with compiler error C3197.

     error C2599: 'CustomEnum': the forward declaration of a WinRT enum is not allowed
    
     error C3197: 'public': can only be used in definitions
    

    예제(이전)Example (before)

     namespace A {
       public enum class CustomEnum: int32;  // forward declaration; error C2599, error C3197
     }
    
     namespace A {
       public enum class CustomEnum: int32
       {
         Value1
       };
     }
    
     public ref class Component sealed
     {
     public:
       CustomEnum f()
       {
         return CustomEnum::Value1;
       }
     };
    

    예제(이후)Example (after)

               // forward declaration of CustomEnum removed
    
     namespace A {
       public enum class CustomEnum: int32
       {
         Value1
       };
     }
    
     public ref class Component sealed
     {
     public:
       CustomEnum f()
       {
         return CustomEnum::Value1;
       }
     };
    
  • new 오버로드된 비멤버 연산자 및 delete 연산자는 인라인으로 선언할 수 없음(기본적으로 수준 1(/W1)임) 이전 버전의 컴파일러는 new 비멤버 연산자 및 delete 연산자 함수를 인라인으로 선언할 때 경고를 발생시키지 않습니다.Overloaded non-member operator new and operator delete may not be declared inline (Level 1 (/W1) on-by-default) Previous versions of the compiler do not issue a warning when non-member operator new and operator delete functions are declared inline. 이 방식으로 작성된 코드는 형식이 잘못되었으며(진단이 필요하지 않음) 진단하기 힘들 수 있는 일치하지 않는 new 및 delete 연산자로 인해 특히 크기가 지정된 할당 해제와 함께 사용 시 메모리 문제를 일으킬 수 있습니다.Code written in this way is ill-formed (no diagnostic required) and can cause memory issues resulting from mismatched new and delete operators (especially when used together with sized deallocation) that can be difficult to diagnose. 이제 컴파일러는 이런 식으로 작성된 코드를 식별하기 위해 경고 C4595를 발생합니다.The compiler now issues compiler warning C4595 to help identify code written in this way.

     warning C4595: 'operator new': non-member operator new or delete functions may not be declared inline
    

    예제(이전)Example (before)

               inline void* operator new(size_t sz)  // warning C4595
     {
       ...
     }
    

    예제(이후)Example (after)

               void* operator new(size_t sz)  // removed inline
     {
       ...
     }
    

    이러한 방식으로 작성된 코드를 수정하려면 연산자 정의를 헤더 파일에서 해당하는 소스 파일로 이동해야 합니다.Fixing code that's written in this way might require that the operator definitions be moved out of a header file and into a corresponding source file.

Visual Studio 2015 업데이트 3의 규칙 향상Conformance Improvements in Visual Studio 2015 Update 3

  • std::is_convertable에서 자체 할당을 검색함(표준 라이브러리) 복사 생성자가 삭제되거나 private인 경우 이전 버전의 std::is_convertable 형식 특성에서 class 형식의 자체 할당을 올바르게 검색하지 못했습니다.std::is_convertable now detects self-assignment (standard library) Previous versions of the std::is_convertable type-trait did not correctly detect self-assignment of a class type when its copy constructor is deleted or private. 이제 복사 생성자가 삭제되거나 private인 클래스 형식에 적용할 때 std::is_convertable<>::valuefalse로 올바르게 설정됩니다.Now, std::is_convertable<>::value is correctly set to false when applied to a class type with a deleted or private copy constructor.

    이 변경과 관련된 컴파일러 진단은 없습니다.There is no compiler diagnostic associated with this change.

    Example

     #include <type_traits>
    
     class X1
     {
     public:
         X1(const X1&) = delete;
     };
    
     class X2
     {
     private:
         X2(const X2&);
     };
    
     static_assert(std::is_convertible<X1&, X1>::value, "BOOM");static_assert(std::is_convertible<X2&, X2>::value, "BOOM");
    

    이전 버전의 Visual C++에서는 std::is_convertable<>::valuetrue로 잘못 설정되었기 때문에 이 예제의 맨 아래에 있는 정적 어설션이 성공합니다.In previous versions of Visual C++, the static assertions at the bottom of this example pass because std::is_convertable<>::value was incorrectly set to true. 이제 std::is_convertable<>::valuefalse로 올바르게 설정되므로 정적 어설션이 실패합니다.Now, std::is_convertable<>::value is correctly set to false, causing the static assertions to fail.

  • 기본값으로 설정되었거나 삭제된 trivial 복사 및 이동 생성자에서 액세스 지정자를 적용함 이전 버전의 컴파일러는 기본값으로 설정되었거나 삭제된 trivial 복사 및 이동 생성자의 액세스 지정자를 확인한 후에 호출하도록 허용하지 않았습니다.Defaulted or deleted trivial copy and move constructors respect access specifiers Previous versions of the compiler did not check the access specifier of defaulted or deleted trivial copy and move constructors before allowing them to be called. 이 이전 동작은 올바르지 않으며 C++ 표준을 따르지 않습니다.This old behavior was incorrect and does not conform to the C++ standard. 경우에 따라 이 이전 동작으로 잘못된 코드가 자동으로 생성되어 예기치 않은 런타임 동작이 발생하는 위험이 초래되었습니다.In some cases, this old behavior created a risk of silent bad code generation, resulting in unpredictable runtime behavior. 이제 컴파일러에서 기본값으로 설정되었거나 삭제된 trivial 복사 및 이동 생성자의 액세스 지정자를 검사하여 호출 가능 여부를 확인하고, 호출할 수 없는 경우 결과로 컴파일러 경고 C2248을 실행합니다.The compiler now checks the access specifier of defaulted or deleted trivial copy and move constructors to determine whether it can be called, and if not, issues compiler warning C2248 as a result.

     error C2248: 'S::S' cannot access private member declared in class 'S'
    

    예제(이전)Example (before)

     class S {
     public:
        S() = default;
     private:
         S(const S&) = default;
     };
    
     void f(S);  // pass S by value
    
     int main()
     {
         S s;
         f(s);  // error C2248, can't invoke private copy constructor
     }
    

    예제(이후)Example (after)

     class S {
     public:
        S() = default;
     private:
         S(const S&) = default;
     };
    
     void f(const S&);  // pass S by reference
    
     int main()
     {
         S s;
         f(s);
     }
    
  • 특성 사용 ATL 코드 지원 중단(기본적으로 수준 1(/W1)임) 이전 버전의 컴파일러는 특성 사용 ATL 코드를 지원했습니다.Deprecation of attributed ATL code support (Level 1 (/W1) on-by-default) Previous versions of the compiler supported attributed ATL code. Visual C++ 2008부터 시작된 특성 사용 ATL 코드 지원 제거의 다음 단계로 특성 사용 ATL 코드가 더 이상 사용되지 않습니다.As the next phase of removing support for attributed ATL code that began in Visual C++ 2008, attributed ATL code has been deprecated. 이제 컴파일러에서 사용되지 않는 이러한 종류의 코드를 식별하기 위해 컴파일러 경고 C4467을 실행합니다.The compiler now issues compiler warning C4467 to help identify this kind of deprecated code.

     warning C4467: Usage of ATL attributes is deprecated
    

    컴파일러에서 지원이 제거될 때까지 특성 사용 ATL 코드를 계속 사용하려는 경우 /Wv:18 또는 /wd4467 명령줄 인수를 컴파일러에 전달하거나 소스 코드에 #pragma warning(disable:4467)을 추가하여 이 경고를 해제할 수 있습니다.If you want to continue using attributed ATL code until support is removed from the compiler, you can disable this warning by passing the /Wv:18 or /wd4467 command line arguments to the compiler, or by adding #pragma warning(disable:4467) in your source code.

    예제 1(이전)Example 1 (before)

               [uuid("594382D9-44B0-461A-8DE3-E06A3E73C5EB")]
     class A {};
    

    예제 1(이후)Example 1 (after)

     __declspec(uuid("594382D9-44B0-461A-8DE3-E06A3E73C5EB")) A {};
    

    사용되지 않는 ATL 특성의 사용을 방지하기 위해 아래 예제 코드와 같이 IDL 파일을 만들 수 있습니다.Sometimes you might need or want to create an IDL file to avoid the use deprecated ATL attributes, as in the example code below

    예제 2(이전)Example 2 (before)

     [emitidl];
     [module(name="Foo")];
    
     [object, local, uuid("9e66a290-4365-11d2-a997-00c04fa37ddb")]
     __interface ICustom {
         HRESULT Custom([in] long l, [out, retval] long *pLong);
         [local] HRESULT CustomLocal([in] long l, [out, retval] long *pLong);
     };
    
     [coclass, appobject, uuid("9e66a294-4365-11d2-a997-00c04fa37ddb")]
     class CFoo : public ICustom
     {
         // ...
     };
    

    먼저 *.idl 파일을 만듭니다. 생성된 vc140.idl 파일을 사용하여 인터페이스와 주석이 포함된 *.idl 파일을 가져올 수 있습니다.First, create the *.idl file; the vc140.idl generated file can be used to obtain an *.idl file containing the interfaces and annotations.

    그런 다음 빌드에 MIDL 단계를 추가하여 C++ 인터페이스 정의가 생성되었는지 확인합니다.Next, add a MIDL step to your build to make sure that the C++ interface definitions are generated.

    예제 2 IDL(이후)Example 2 IDL (after)

     import "docobj.idl";
    
     [
         object,local,uuid(9e66a290-4365-11d2-a997-00c04fa37ddb)
     ]
    
     interface ICustom : IUnknown {
         HRESULT  Custom([in] long l, [out,retval] long *pLong);
         [local] HRESULT  CustomLocal([in] long l, [out,retval] long *pLong);
     };
    
     [ version(1.0), uuid(29079a2c-5f3f-3325-99a1-3ec9c40988bb) ]
     library Foo
     {
         importlib("stdole2.tlb");
         importlib("olepro32.dll");
             [
                 version(1.0),
                 appobject,uuid(9e66a294-4365-11d2-a997-00c04fa37ddb)
             ]
    
         coclass CFoo {
             interface ICustom;
         };
     }
    

    아래 예제 코드와 같이 구현 파일에서 직접 ATL을 사용합니다.Then, use ATL directly in the implementation file, as in the example code below.

    예제 2 구현(이후)Example 2 Implementation (after)

     #include <idl.header.h>
     #include <atlbase.h>
    
     class ATL_NO_VTABLE CFooImpl :
         public ICustom,
         public ATL::CComObjectRootEx<CComMultiThreadModel>
     {
     public:
         BEGIN_COM_MAP(CFooImpl)
         COM_INTERFACE_ENTRY(ICustom)
         END_COM_MAP()
     };
    
  • 미리 컴파일된 헤더(PCH) 파일 및 일치하지 않는 #include 지시문(/Wall /WX에만 해당) 이전 버전의 컴파일러는 미리 컴파일된 헤더(PCH) 파일을 사용할 때 -Yc-Yu 컴파일 간의 소스 파일에서 일치하지 않는 #include 지시문을 허용했습니다.Precompiled header (PCH) files and mismatched #include directives (only affects /Wall /WX) Previous versions of the compiler accepted mismatched #include directives in source files between -Yc and -Yu compilations when using precompiled header (PCH) files. 이런 방식으로 작성된 코드는 컴파일러에서 더 이상 허용되지 않습니다.Code written in this way is no longer accepted by the compiler. PCH 파일 사용 시 일치하지 않는 #include 지시문을 식별하기 위해 이제 컴파일러에서 컴파일러 경고 CC4598을 실행합니다.The compiler now issues compiler warning CC4598 to help identify mismatched #include directives when using PCH files.

     warning C4598: 'b.h': included header file specified for Ycc.h at position 2 does not match Yuc.h at that position
    

    예제(이전):Example (before):

    X.cpp(-Ycc.h)X.cpp (-Ycc.h)

     #include "a.h"
     #include "b.h"
     #include "c.h"
    

    Z.cpp(-Yuc.h)Z.cpp (-Yuc.h)

     #include "b.h"
     #include "a.h"  // mismatched order relative to X.cpp
     #include "c.h"
    

    예제(이후)Example (after)

    X.cpp(-Ycc.h)X.cpp (-Ycc.h)

     #include "a.h"
     #include "b.h"
     #include "c.h"
    

    Z.cpp(-Yuc.h)Z.cpp (-Yuc.h)

     #include "a.h"
     #include "b.h" // matched order relative to X.cpp
     #include "c.h"
    
  • 미리 컴파일된 헤더(PCH) 파일 및 일치하지 않는 include 지시문(/Wall /WX에만 해당) 이전 버전의 컴파일러는 미리 컴파일된 헤더(PCH) 파일을 사용할 때 -Yc-Yu 컴파일 간의 컴파일러에 일치하지 않는 include 디렉터리(-I) 명령줄 인수를 허용했습니다.Precompiled header (PCH) files and mismatched include directories (only affects /Wall /WX) Previous versions of the compiler accepted mismatched include directory (-I) command line arguments to the compiler between -Yc and -Yu compilations when using precompiled header (PCH) files. 이런 방식으로 작성된 코드는 컴파일러에서 더 이상 허용되지 않습니다.Code written in this way is no longer accepted by the compiler. PCH 파일 사용 시 일치하지 않는 include 디렉터리(-I) 명령줄 인수를 식별하기 위해 이제 컴파일러에서 컴파일러 경고 CC4599를 실행합니다.The compiler now issues compiler warning CC4599 to help identify mismatched include directory (-I) command line arguments when using PCH files.

     warning C4599: '-I..' : specified for Ycc.h at position 1 does not match Yuc.h at that position
    

    예제(이전)Example (before)

     cl /c /Wall /Ycc.h -I.. X.cpp
     cl /c /Wall /Yuc.h Z.cpp
    

    예제(이후)Example (after)

     cl /c /Wall /Ycc.h -I.. X.cpp
     cl /c /Wall /Yuc.h -I.. Z.cpp
    

Visual Studio 2013의 새로운 C++ 기능What's New for C++ in Visual Studio 2013

향상된 ISO C/C++ 표준 지원Improved ISO C/C++ Standards Support

컴파일러Compiler

Microsoft Visual C++ 컴파일러에서 지원하는 ISO C++11 언어 기능은 다음과 같습니다.The Microsoft Visual C++ compiler supports these ISO C++11 language features:

  • 함수 템플릿의 기본 템플릿 인수Default template arguments for function templates.
  • 위임 생성자Delegating constructors
  • 명시적 변환 연산자Explicit conversion operators.
  • 이니셜라이저 목록 및 균일 초기화Initializer lists and uniform initialization.
  • 원시 문자열 리터럴Raw string literals.
  • variadic 템플릿Variadic templates.
  • 별칭 템플릿Alias templates.
  • 삭제된 함수Deleted functions.
  • NSDMI(비정적 데이터 멤버 이니셜라이저)Non-static data member initializers (NSDMIs).
  • 기본값으로 설정된 함수Defaulted functions. *
  • 다음과 같은 ISO C99 언어 기능을 지원합니다.Supports these ISO C99 language features:
  • _Bool_Bool
  • 복합 리터럴Compound literals.
  • 지정된 이니셜라이저Designated initializers.
  • 코드 혼합 선언Mixing declarations with code.
  • 새 컴파일러 옵션 /Zc:strictStrings를 사용하여 문자열 리터럴을 수정할 수 있는 값으로 변환하지 못하게 할 수 있습니다.String literal conversion to modifiable values can be disallowed by using the new compiler option /Zc:strictStrings. C++98에서 문자열 리터럴은 char*로(및 전각 문자열 리터럴은 wchar_t*로) 변환할 수 없었습니다.In C++98, conversion from string literals to char* (and wide string literals to wchar_t*) was deprecated. C++11에서 변환이 완전히 제거되었습니다.In C++11, the conversion was removed entirely. 컴파일러에서 표준을 엄격하게 준수할 수는 있지만, 사용자가 변환을 제어할 수 있도록 /Zc:strictStrings 옵션이 제공됩니다.Although the compiler could strictly conform to the standard, instead it provides the /Zc:strictStrings option so that you can control conversion. 기본적으로 이 옵션은 해제되어 있습니다.By default, the option is off. 디버그 모드에서 이 옵션을 사용하면 STL은 컴파일되지 않습니다.Note that when you are using this option in debug mode, the STL will not compile.
  • rvalue/lvalue 참조 캐스트.rvalue/lvalue Reference Casts. rvalue 참조를 사용하여 C++11은 lvalue와 rvalue를 명확하게 구별할 수 있습니다.With rvalue references, C++11 can clearly distinguish between lvalues and rvalues. 이전에는 컴파일러가 특정 캐스팅 시나리오에서 이 기능을 제공하지 않았습니다.Previously, the compiler did not provide this in specific casting scenarios. C++ Language Working Paper(5.4, [expr.cast]/1 섹션 참조)에 따라 새로운 /Zc:rvalueCast 컴파일러 옵션이 추가되었습니다.A new compiler option, /Zc:rvalueCast, has been added to make the compiler conformant with the C++ Language Working Paper(see section 5.4, [expr.cast]/1). 이 옵션이 지정되지 않은 경우 기본 동작은 Visual Studio 2012와 동일합니다.The default behavior when this option is not specified is the same as in Visual Studio 2012.
    • 참고: 기본 설정되는 함수의 경우 멤버 수준 이동 생성자 및 이동 대입 연산자를 요청하기 위한 =default 사용은 지원되지 않습니다.Note: For defaulted functions, using =default to request memberwise move constructors and move assignment operators is not supported.

C99 라이브러리C99 Libraries

누락된 함수에 대한 선언과 구현이 math.h, ctype.h, wctype.h, stdio.h, stdlib.h 및 wchar.h 헤더에 추가되었습니다.Declarations and implementations are added for missing functions in these headers: math.h, ctype.h, wctype.h, stdio.h, stdlib.h, and wchar.h. 또한 새로운 complex.h, stdbool.h, fenv.h 및 inttypes.h 헤더가 추가되었고 모든 함수에 대한 구현이 여기에 선언되었습니다.Also added are the new headers complex.h, stdbool.h, fenv.h, and inttypes.h, and implementations for all the functions declared in them. 새로운 C++ 래퍼 헤더(ccomplex, cfenv, cinttypes, ctgmath)가 있고, 다른 많은 헤더(ccomplex, cctype, clocale, cmath, cstdint, cstdio, cstring, cwchar 및 cwctype)가 업데이트되었습니다.There are new C++ wrapper headers (ccomplex, cfenv, cinttypes, ctgmath) and a number of others are updated (ccomplex, cctype, clocale, cmath, cstdint, cstdio, cstring, cwchar, and cwctype).

표준 템플릿 라이브러리Standard Template Library

C++11 명시적 변환 연산자, 이니셜라이저 목록, 범위가 지정된 열거형 및 variadic 템플릿을 지원합니다.Support for the C++11 explicit conversion operators, initializer lists, scoped enums, and variadic templates. 이제 모든 컨테이너가 C++11의 세부적인 요소 요구 사항을 지원합니다.All containers now support the C++11 fine-grained element requirements. 다음과 같은 C++14 기능을 지원합니다.Support for these C++14 features:

  • 투명 연산자 구조 함수(less<>, greater<>, plus<>, multiplies<> 등)"Transparent operator functors" less<>, greater<>, plus<>, multiplies<>, and so on.
  • make_unique(args...) 및 make_unique<T[]>(n)make_unique(args...) and make_unique<T[]>(n)
  • cbegin()/cend(), rbegin()/rend(), 및 crbegin()/crend() 비멤버 함수cbegin()/cend(), rbegin()/rend(), and crbegin()/crend() non-member functions.
  • <atomic> 성능이 다양하게 향상되었습니다.<atomic> received numerous performance enhancements.
  • <type_traits> 안정성이 크게 향상되었으며 코드가 수정되었습니다.<type_traits> received major stabilization and code fixes.

주요 변경 사항Breaking Changes

이와 같이 향상된 ISO C/C++ 표준 지원 기능을 사용하려면 C++11을 따르고 Visual Studio 2013의 Visual C++에서 올바르게 컴파일되도록 기존 코드를 변경해야 할 수 있습니다.This improved support for ISO C/C++ standards may require changes to existing code so that it conforms to C++11 and compiles correctly in Visual C++ in Visual Studio 2013.

Visual C++ 라이브러리 향상Visual C++ Library Enhancements

  • C++ REST SDK가 추가되었습니다.C++ REST SDK is added. 이 SDK에는 REST 서비스의 최신 C++ 구현이 포함되어 있습니다.It has a modern C++ implementation of REST services.
  • C++ AMP 질감 지원이 향상되었습니다.C++ AMP Texture support is enhanced. 이제 밉 맵 및 새로운 샘플링 모드를 지원합니다.It now includes support for mipmaps and new sampling modes.
  • PPL 작업에서 여러 일정 관리 기술 및 비동기 디버깅을 지원합니다.PPL tasks support multiple scheduling technologies and asynchronous debugging. 새 API를 사용하면 정상 결과 및 예외 조건 둘 다에 대한 PPL 작업을 만들 수 있습니다.New APIs enable the creation of PPL tasks for both normal results and exception conditions.

C++ 응용 프로그램 성능C++ Application Performance

  • 자동 벡터화 도우미에서 더 많은 C++ 패턴을 인식하고 최적화하므로 코드를 더 빠르게 실행할 수 있습니다.Auto-Vectorizer now recognizes and optimizes more C++ patterns to make your code run faster.
  • ARM 플랫폼 및 Atom 마이크로 아키텍처 코드 품질이 향상되었습니다.ARM platform and Atom micro-architecture code quality improvements.
  • __vectorcall 호출 규칙이 추가되었습니다.__vectorcall calling convention is added. 백터 레지스터를 사용하는 __vectorcall 호출 규칙을 통해 벡터 형식 인수를 전달합니다.Pass vector type arguments by using the __vectorcall calling convention to use vector registers.
  • 새 링커 옵션이 제공됩니다.New Linker Options. /Gw(컴파일러) 및 /Gy(어셈블러) 스위치를 사용하면 링커 최적화를 통해 간결한 이진 파일을 생성할 수 있습니다.The /Gw (compiler) and /Gy (assembler) switches enable linker optimizations to produce leaner binaries.
  • C++ AMP 공유 메모리를 지원하여 CPU와 GPU 간의 데이터 복사를 줄이거나 제거합니다.C++ AMP shared memory support to reduce or eliminate data copying between CPU and GPU.

향상된 PGO(프로필 기반 최적화)Profile Guided Optimization (PGO) enhancements

  • PGO 사용으로 최적화된 응용 프로그램 작업 집합의 감소로 인한 성능 향상Performance improvements from a reduction in the working set of apps that are optimized by using PGO.
  • Windows 스토어 앱 개발을 위한 새로운 PGONew PGO for Windows Store app development.

Windows 스토어 앱 개발 지원Windows Store App Development Support

  • 값 구조체에서 boxed 형식 지원Support For Boxed Types In Value structs. int와는 달리 IBox^처럼 null일 수 있는 필드를 사용하여 값 형식을 정의할 수 있습니다. 즉, 필드가 값을 포함할 수 있거나 nullptr과 같을 수 있습니다.You can now define value types by using fields that can be null—for example, IBox^ as opposed to int. This means that the fields can either have a value, or be equal to nullptr.
  • 다양한 예외 정보Richer Exception Information. C++/CX는 ABI(응용 프로그램 이진 인터페이스)에서 자세한 예외 정보를 캡처하고 전파할 수 있도록 하는 새로운 Windows 오류 모델을 지원합니다. 여기에는 호출 스택과 사용자 지정 메시지 문자열이 포함됩니다.C++/CX supports the new Windows error model that enables the capture and propagation of rich exception information across the application binary interface (ABI); this includes call stacks and custom message strings.
  • 가상 형식의 Object::ToString()Object::ToString() Is Now Virtual. 사용자 정의 Windows 런타임 ref 형식에서 ToString을 재정의할 수 있습니다.You can now override ToString in user-defined Windows Runtime ref types.
  • 사용되지 않는 API 지원Support For Deprecated APIs. 공용 Windows 런타임 API는 이제 사용되지 않는 것으로 표시되고 빌드 경고로 나타나는 사용자 지정 메시지가 제공될 수 있으며, 마이그레이션 지침을 제공할 수 있습니다.Public Windows Runtime APIs can now be marked as deprecated and given a custom message that appears as a build warning and can provide migration guidance.
  • 향상된 디버거Debugger Improvements. 네이티브/JavaScript interop 디버깅, Windows 런타임 예외 진단 및 비동기 코드 디버깅(Windows 런타임 및 PPL)을 지원합니다.Support for native/JavaScript interop debugging, Windows Runtime exception diagnosis, and async code debugging (both Windows Runtime and PPL).
    • 참고: 이 섹션에서 설명한 C++ 관련 기능 및 향상된 기능 외에도, 향상된 다른 Visual Studio 기능을 사용하면 Windows 스토어 앱을 더 효과적으로 작성할 수 있습니다.Note: In addition to the C++-specific features and enhancements that are described in this section, other enhancements in Visual Studio also can help you write better Windows Store apps.

진단 향상Diagnostics Enhancements

  • 향상된 디버거.Debugger Improvements. 비동기 디버깅 및 [내 코드만] 디버깅을 지원합니다.Support for async debugging and Just My Code debugging.
  • 코드 분석 범주.Code Analysis Categories. 이제 코드 분석기에서 분류된 출력을 보고 코드 결함을 찾아 수정할 수 있습니다.You can now view categorized output from the Code Analyzer to help you find and fix code defects.
  • XAML 진단.XAML Diagnostics. 이제 XAML에서 UI 응답성 및 배터리 사용 문제를 진단할 수 있습니다.You can now diagnose UI-responsiveness and battery-usage issues in your XAML.
  • 그래픽 및 GPU 디버깅 향상Graphics and GPU Debugging Improvements.
  • 원격 캡처 및 실제 장치에서의 재생Remote capture and playback on real devices.
  • C++ AMP 및 CPU 동시 디버깅Simultaneous C++ AMP and CPU debugging.
  • 향상된 C++ AMP 런타임 진단Improved C++ AMP runtime diagnostics.
  • HLSL 계산 셰이더 추적 디버깅HLSL Compute shader trace debugging.

3차원 그래픽 향상3-D Graphics Enhancements

  • 미리 곱한 알파 DDS 형식에 대한 이미지 콘텐츠 파이프라인 지원Image Content Pipeline support for pre-multiplied alpha DDS format.
  • 이미지 편집기에서 렌더링을 위해 내부적으로 미리 곱한 알파를 사용하며, 이에 따라 짙은 후광과 같은 렌더링 아티팩트를 방지합니다.Image Editor uses internally pre-multiplied alpha for rendering, and thereby avoids rendering artifacts such as dark halos.
  • 이미지 및 모델 편집기.Image and Model Editors. 이미지 편집기 및 모델 편집기의 셰이더 디자이너에서 사용자 정의 필터 만들기가 지원됩니다.User-defined filter creation is now supported in Shader Designer in Image Editor and Model Editor.

IDE 및 생산성IDE and Productivity

향상된 코드 서식 지정Improved Code Formatting. C++ 코드에 보다 다양한 서식 설정을 적용할 수 있습니다.You can apply more formatting settings to your C++ code. 이러한 설정을 사용하여 중괄호 및 키워드의 새 줄 배치, 들여쓰기, 공백 및 줄 바꿈을 제어할 수 있습니다.By using these settings, you can control new-line placement of braces and keywords, indentation, spacing, and line wrapping. 문과 블록을 완료할 때와 파일에 코드를 붙여 넣을 때 코드의 서식이 자동으로 지정됩니다.Code is automatically formatted when you complete statements and blocks, and when you paste code into a file.

중괄호 완성Brace Completion. C++ 코드는 이제 다음 여는 문자에 해당하는 닫는 문자를 자동으로 완성합니다.C++ code now auto-completes the closing characters that correspond to these opening characters:

  • {(중괄호){ (curly brace)
  • [(대괄호)[ (square bracket)
  • ((괄호)( (parentheses)
  • '(작은따옴표)' (single quote)
  • "(큰따옴표)" (double quote)

추가 C++ 자동 완성 기능Additional C++ Auto-completion Features.

  • 클래스 형식에 세미콜론을 추가합니다.Adds semicolon for class types.
  • 원시 문자열 리터럴에 대한 괄호를 완성합니다.Completes parentheses for raw string literals.
  • 여러 줄 주석(/* /)을 완성합니다.Completes multi-line comments (/ */)

모든 참조 찾기에서 텍스트 일치 목록을 표시한 후 백그라운드에서 참조를 자동으로 확인하고 필터링합니다.Find All References now automatically resolves and filters references in the background after it displays the list of textual matches.

컨텍스트 기반 멤버 목록 필터링Context-Based Member List Filtering. 액세스할 수 없는 멤버는 IntelliSense 멤버 목록에서 필터링됩니다.Inaccessible members are filtered out of the IntelliSense member lists. 예를 들어 형식을 구현하는 코드를 수정하지 않으면 개인 멤버는 멤버 목록에 표시되지 않습니다.For example, private members are not displayed in the member list unless you are modifying the code that implements the type. 멤버 목록이 열려 있는 동안 Ctrl+J를 눌러 필터링을 한 수준씩 제거할 수 있습니다(현재 멤버 목록 창에만 적용).While the member list is open, you can press Ctrl+J to remove one level of filtering (applies only to the current member list window). Ctrl+J를 다시 눌러 텍스트 필터링을 제거하고 모든 멤버를 표시할 수 있습니다.You can press Ctrl+J again to remove the textual filtering and show every member.

매개 변수 도움말 스크롤Parameter Help Scrolling. 매개 변수 도움말 도구 설명에 표시된 함수 시그니처는 임의의 시그니처를 표시하고 현재 컨텍스트에 따라 업데이트하는 것이 아니라 실제로 입력한 매개 변수의 수에 따라 변경됩니다.The displayed function signature in the parameter-help tooltip now changes based on the number of parameters you've actually typed, rather than just showing an arbitrary signature and not updating it based on the current context. 매개 변수 도움말도 중첩된 함수에 표시될 때 올바르게 작동합니다.Parameter help also functions correctly when it's displayed on nested functions.

헤더/코드 파일 전환Toggle Header/Code File. 이제 바로 가기 메뉴 또는 바로 가기 키의 명령을 사용하여 헤더와 해당 코드 파일 사이를 전환할 수 있습니다.You can now toggle between a header and its corresponding code file by using a command on the shortcut menu, or a keyboard shortcut.

크기 조정 가능한 C++ 프로젝트 속성 창Resizable C++ Project Properties Window

C++/CX 및 C++/CLI에서 이벤트 처리기 코드 자동 생성Auto-generation of Event Handler Code in C++/CX and C++/CLI. C++/CX 또는 C++/CLI 코드 파일에 이벤트 처리기를 추가하는 코드를 입력하는 경우 편집기는 대리자 인스턴스와 이벤트 처리기 정의를 자동으로 생성할 수 있습니다.When you are typing code to add an event handler in a C++/CX or C++/CLI code file, the editor can automatically generate the delegate instance and event-handler definition. 도구 설명 창은 이벤트 처리기 코드를 자동으로 생성할 수 있을 때 나타납니다.A tooltip window appears when event-handler code can be auto-generated.

향상된 DPI 인식DPI Awareness Enhancement. 이제 응용 프로그램 매니페스트 파일의 DPI 인식 설정에서 "모니터 단위 높은 DPI 인식" 설정을 지원합니다.The DPI Awareness setting for application manifest files now supports the "Per Monitor High DPI Aware" setting.

더 빠른 구성 전환Faster Configuration Switching. 대규모 응용 프로그램에서 특히 후속 전환 작업과 같은 구성 전환이 훨씬 더 빠르게 실행됩니다.For large applications, switching configurations—especially subsequent switching operations—execute much more quickly.

빌드 시간 효율성Build Time Efficiency. 다양한 최적화 및 멀티 코어 활용으로 특히 대규모 프로젝트에서 빌드를 보다 빠르게 수행합니다.Numerous optimizations and multi-core utilization make builds faster, especially for large projects. C++ WinMD에 대한 참조가 있는 C++ 응용 프로그램의 증분 빌드도 훨씬 더 빠릅니다.Incremental builds for C++ applications that have references to C++ WinMD are also much faster.

Visual Studio 2012의 새로운 C++ 기능What's New for C++ in Visual Studio 2012

향상된 C++11 표준 지원Improved C++11 Standards Support

표준 템플릿 라이브러리Standard Template Library

  • 새로운 STL 헤더 지원: <atomic>, <chrono>, <condition_variable>, <filesystem>, <future>, <mutex>, <ratio> 및 <thread>Support for new STL headers: <atomic>, <chrono>, <condition_variable>, <filesystem>, <future>, <mutex>, <ratio>, and <thread>.
  • 메모리 리소스 사용을 최적화하기 위해 컨테이너가 더 작아졌습니다.To optimize memory resource usage, containers are now smaller. 예를 들어 기본 설정이 있는 x86 릴리스 모드에서 std::vector는 Visual Studio 2010의 16바이트에서 Visual Studio 2012의 12바이트로 축소되었으며, std::map은 Visual Studio 2010의 16바이트에서 Visual Studio 2012의 8바이트로 축소되었습니다.For example, in x86 release mode with default settings, std::vector has shrunk from 16 bytes in Visual Studio 2010 to 12 bytes in Visual Studio 2012, and std::map has shrunk from 16 bytes in Visual Studio 2010 to 8 bytes in Visual Studio 2012.
  • C++11 표준에서 허용되었지만 필요하지 않은 SCARY 반복기가 구현되었습니다.As permitted but not required by the C++11 Standard, SCARY iterators have been implemented.

기타 향상된 C++11 기능Other C++11 Enhancements

  • 범위 기반 for 루프.Range-based for loops. 배열, STL 컨테이너 및 Windows 런타임 컬렉션과 함께 작동하는 더 강력한 루프를 for (for-range-declaration : expression) 형식으로 작성할 수 있습니다.You can write more robust loops that work with arrays, STL containers, and Windows Runtime collections in the form for ( for-range-declaration : expression ). 핵심 언어 지원에 포함됩니다.This is part of the Core Language support.
  • 빈 람다 도입자([])로 시작하고 로컬 변수를 갭처하지 않는 코드 블록인 상태 비저장 람다는 이제 C++11 표준에 필요한 함수 포인터로 암시적으로 변환됩니다.Stateless lambdas, which are blocks of code that begin with an empty lambda introducer [] and capture no local variables, are now implicitly convertible to function pointers as required by the C++11 Standard.
  • 범위가 지정된 열거형 지원Scoped enumerations support. C++ enum class 열거형-키가 지원됩니다.The C++ enum class enum-key is now supported. 다음 코드에서는 이 열거형-키가 이전 열거형 동작과 다른 점을 보여 줍니다.The following code demonstrates how this enum-key differs from previous enum behavior.

    enum class Element { Hydrogen, Helium, Lithium, Beryllium };
    void func1(Element e);
    func1(Hydrogen); // error C2065: 'Hydrogen' : undeclared identifier
    func1(Element::Helium); // OK
    

Windows 스토어 앱 개발 지원Windows Store App Development Support

  • 네이티브 XAML 기반 UI 모델Native XAML-based UI model. Windows 스토어 앱의 경우 새로운 네이티브 XAML 기반 UI 모델을 사용할 수 있습니다.For Windows Store apps, you can use the new native XAML-based UI model.
  • Visual C++ 구성 요소 확장Visual C++ Component Extensions. 이러한 확장은 Windows 스토어 앱의 필수 구성 요소인 Windows 런타임 개체의 사용을 간소화합니다.These extensions simplify consumption of Windows Runtime objects, which are a necessary part of Windows Store apps. 자세한 내용은 "C++/CX(C ++ 및 Visual C ++ 언어 참조)를 사용하는 Windows 스토어 앱에 대한 로드맵"을 참조하세요.For more information, see Roadmap for Windows Store apps using C++ and Visual C++ Language Reference (C++/CX)
  • DirectX 게임DirectX games. Windows 스토어 앱에 대한 새로운 DirectX 지원을 사용하여 흥미로운 게임을 개발할 수 있습니다.You can develop engaging games by using the new DirectX support for Windows Store apps.
  • XAML/DirectX interopXAML/DirectX interop. XAML과 DirectX를 모두 사용하는 Windows 스토어 앱이 효율적으로 상호 운용됩니다.Windows Store apps that use both XAML and DirectX now interoperate efficiently.
  • Windows 런타임 구성 요소 DLL 개발Windows Runtime Component DLL development. 구성 요소 DLL 개발을 통해 Windows 런타임 환경을 확장할 수 있습니다.Component DLL development makes the Windows Runtime environment extensible.

컴파일러 및 링커Compiler and Linker

  • 자동 벡터화 도우미Auto-vectorizer. 컴파일러는 코드에서 루프를 분석하고, 가능한 경우 모든 최신 프로세서에 있는 벡터 레지스터와 명령을 사용하는 명령을 내보냅니다.The compiler analyzes loops in your code and, where possible, emits instructions that use the vector registers and instructions that are present in all modern processors. 이렇게 하면 루프가 더 빨리 실행됩니다.This makes the loops run faster. (스트리밍 SIMD 확장에 대한 프로세서 명령은 SSE로 알려져 있습니다.)(The processor instructions are known as SSE, for Streaming SIMD Extensions). 이 최적화는 자동으로 적용되므로 사용하도록 설정하거나 요청할 필요가 없습니다.You do not have to enable or request this optimization because it is applied automatically.
  • 자동 평행화 도우미Auto-parallelizer. 컴파일러는 코드에서 루프를 분석하고, 계산을 여러 코어 또는 프로세서에 분산시키는 명령을 내보냅니다.The compiler can analyze loops in your code and emit instructions that spread the calculations across multiple cores or processors. 이렇게 하면 루프가 더 빠르게 실행될 수 있습니다.This can make the loops run faster. 이 최적화는 기본적으로 사용하도록 설정되지 않으므로 요청해야 합니다.You must request this optimization because it is not enabled by default. 대부분의 경우 코드에서 병렬화하려는 루프 바로 앞에 #pragma loop(hint_parallel(N))를 포함하는 것이 좋습니다.In many cases, it helps to include a #pragma loop(hint_parallel(N)) in your code immediately before the loops that you want parallelized.
  • 자동 벡터화 도우미와 자동 평행화 도우미는 함께 작동하여 계산이 여러 코어에 분산되고 각 코어의 코드에서 벡터 레지스터를 사용합니다.The auto-vectorizer and auto-parallelizer can work together so that calculations are spread across multiple cores and the code on each core uses its vector registers.

Visual Studio 2012 업데이트 1의 새로운 기능New in Visual Studio 2012 Update 1

C++ 코드를 작성할 때 Windows XP를 대상으로 지정합니다.Target Windows XP when you build your C++ code. Visual C++ 컴파일러 및 라이브러리를 사용하여 Windows XP 및 Windows Server 2003을 대상으로 지정할 수 있습니다.You can use the Visual C++ compiler and libraries to target Windows XP and Windows Server 2003.

병렬 프로그래밍 지원Parallel Programming Support

C++ AMP(Accelerated Massive Parallelism)C++ Accelerated Massive Parallelism (AMP)

C++ AMP는 일반적으로 개별 그래픽 카드에서 GPU로 존재하는 데이터 병렬 하드웨어를 활용하여 C++ 코드의 실행을 가속화합니다.C++ AMP accelerates the execution of your C++ code by taking advantage of the data-parallel hardware that's ordinarily present as a GPU on a discrete graphics card. C++ AMP 프로그래밍 모델에는 다차원 배열, 인덱싱, 메모리 전송, 바둑판식 배열 및 수학 함수 라이브러리가 포함됩니다.The C++ AMP programming model includes multidimensional arrays, indexing, memory transfer, tiling, and a mathematical function library. C++ AMP 언어 확장 및 컴파일러 제한을 사용하여 CPU에서 GPU로 데이터를 이동하는 방법을 제어할 수 있습니다.By using C++ AMP language extensions and compiler restrictions, you can control how data is moved from the CPU to the GPU and back.

디버깅Debugging. C++ AMP를 사용하여 GPU를 대상으로 하는 앱에 대한 디버깅 환경은 다른 C++ 앱의 디버깅과 같습니다.The debugging experience for apps that use C++ AMP to target the GPU is just like debugging for other C++ apps. 여기에는 앞서 언급한 새로운 병렬 디버깅 추가 기능이 포함됩니다.This includes the new parallel debugging additions that were mentioned earlier.

프로파일링Profiling. C++ AMP 및 다른 Direct3D 기반 프로그래밍 모델을 기반으로 하는 GPU 작업에 대한 프로파일링 지원이 있습니다.There is now profiling support for GPU activity that's based on C++ AMP and other Direct3D-based programming models.

향상된 일반 병렬 프로그래밍General Parallel Programming Enhancements

다중 코어 및 다중 코어 아키텍처로 이동하는 하드웨어를 사용하면 개발자는 더 이상 단일 코어에서 증가하는 클럭 속도를 맞출 수 없습니다.With hardware moving to multi-core and many-core architectures, developers can no longer rely on ever-increasing clock speeds from single-cores. 개발자는 동시성 런타임의 병렬 프로그래밍 지원을 통해 이러한 새 아키텍처를 활용할 수 있습니다.The parallel programming support in the Concurrency Runtime enables developers to take advantage of these new architectures. Visual Studio 2010에는 정교한 데이터 흐름 파이프라인을 표현하여 동시성을 활용하는 기능과 함께 병렬 패턴 라이브러리와 같은 강력한 C++ 병렬 처리 라이브러리가 도입되었습니다.In Visual Studio 2010, powerful C++ parallelization libraries such as the Parallel Patterns Library were introduced, together with features to take advantage of concurrency by expressing sophisticated dataflow pipelines. Visual Studio 2012에서 이러한 라이브러리는 개발자에게 가장 필요한 병렬 패턴에 대해 더 효율적인 성능, 더 많은 제어 및 더 다양한 지원을 제공하도록 확장되었습니다.In Visual Studio 2012, these libraries have been extended to provide better performance, more control, and richer support for the parallel patterns that developers need most. 이제 제품에 포함된 기능은 다음과 같습니다.The breadth of the offering now includes:

  • 비동기 및 연속성을 지원하는 풍부한 작업 기반 프로그래밍 모델A rich task-based programming model that supports asynchrony and continuations.
  • 병렬 알고리즘(fork-join parallelism) - 분기-조인 병렬 처리(parallel_for, affinity_parallel_for, parallel_for_each, parallel_sort, parallel_reduce, parallel_transform)를 지원합니다.Parallel Algorithms , which support fork-join parallelism (parallel_for, parallel_for with affinity, parallel_for_each, parallel_sort, parallel_reduce, parallel_transform).
  • 동시성 안전 컨테이너 - priority_queue, queue, vector 및 map과 같은 std 데이터 구조의 스레드 안전 버전을 제공합니다.Concurrency-safe containers, which provide thread-safe versions of std data structures such as priority_queue, queue, vector, and map.
  • 비동기 에이전트 라이브러리 - 개발자가 동시 단위로 자연스럽게 분해하는 데이터 흐름 파이프라인을 표현하는 데 사용할 수 있습니다.The Asynchronous Agents Library, which developers can use to express dataflow pipelines that naturally decompose into concurrent units.
  • 이 목록에 있는 패턴의 원활한 구성을 용이하게 하는 사용자 지정 가능한 스케줄러 및 리소스 관리자A customizable scheduler and resource manager to facilitate the smooth composition of the patterns in this list.
향상된 일반 병렬 디버깅General Parallel Debugging Enhancements

Visual Studio 2012에서는 병렬 작업 창과 병렬 스택 창 외에도 새로운 병렬 조사식 창을 제공하여 모든 스레드와 프로세스에서 식의 값을 검사하고 결과를 정렬 및 필터링할 수 있습니다.In addition to the Parallel Tasks window and Parallel Stacks window, Visual Studio 2012 offers a new Parallel Watch window so that you can examine the values of an expression across all threads and processes, and perform sorting and filtering on the result. 또한 사용자 고유의 시각화 도우미를 사용하여 창을 확장할 수 있으며, 모든 도구 창에서 새로운 다중 프로세스 지원을 활용할 수 있습니다.You can also use your own visualizers to extend the window, and you can take advantage of the new multi-process support across all tool windows.

IDEIDE

Visual Studio 템플릿 지원Visual Studio Templates support. Visual Studio 템플릿 기술을 사용하여 C++ 프로젝트 및 항목 템플릿을 작성할 수 있습니다.You can now use the Visual Studio Templates technology to author C++ project and item templates.

비동기 솔루션 로드Asynchronous Solution Load. 프로젝트는 비동기적으로 로드됩니다. 즉, 솔루션의 주요 부분이 먼저 로드되어 작업을 더 빨리 시작할 수 있습니다.Projects are now loaded asynchronously—the key parts of the solution first—so that you can start working faster.

원격 디버깅을 위한 자동화된 배포Automated deployment for remote debugging. Visual C++에서 원격 디버깅을 위한 파일 배포가 간소화되었습니다.Deployment of files for remote debugging in Visual C++ has been simplified. 프로젝트 상황에 맞는 메뉴의 배포 옵션은 디버깅 구성 속성에 지정된 파일을 원격 컴퓨터에 자동으로 복사합니다.The Deploy option on the project context menu automatically copies to the remote computer the files that are specified in the debugging configuration properties. 더 이상 파일을 원격 컴퓨터에 수동으로 복사할 필요가 없습니다.Copying files manually to the remote computer is no longer required.

C++/CLI IntelliSenseC++/CLI IntelliSense. C++/CLI는 IntelliSense를 완벽하게 지원합니다.C++/CLI now has full IntelliSense support. 요약 정보, 매개 변수 도움말, 멤버 목록 및 자동 완성과 같은 IntelliSense 기능이 이제 C++/CLI에서 작동합니다.IntelliSense features such as Quick Info, Parameter Help, List Members, and Auto Completion now work for C++/CLI. 또한 이 문서에 나오는 향상된 다른 IntelliSense 및 IDE 기능도 C++/CLI에서 작동합니다.In addition, the other IntelliSense and IDE enhancements listed in this document also work for C++/CLI.

더 다양한 IntelliSense 도구 설명Richer IntelliSense Tooltips. C++ IntelliSense 요약 정보 도구 설명에 더 다양한 XML 문서 주석 스타일 정보가 표시됩니다.C++ IntelliSense Quick Info tooltips now show richer XML documentation comments style information. XML 문서 주석이 있는 라이브러리의 API(예: C++ AMP)를 사용하는 경우 IntelliSense 도구 설명에 선언보다 더 많은 정보가 표시됩니다.If you are using an API from a library—for example, C++ AMP—that has XML documentation comments, then the IntelliSense tooltip shows more information than just the declaration. 또한 코드에 XML 문서 주석이 있는 경우 IntelliSense 도구 설명에는 더 많은 정보가 표시됩니다.Also, if your code has the XML documentation comments, IntelliSense tooltips will show the richer information.

C++ 코드 구문C++ Code Constructs. switch, if-else, for 루프 및 다른 기본 코드 구문에 대한 구조 코드는 멤버 목록 드롭다운 목록에서 사용할 수 있습니다.Skeleton code is available for switch, if-else, for loop, and other basic code constructs, in the List Members drop-down list. 목록에서 코드 부분을 선택하여 코드에 삽입한 다음 필요한 논리를 입력합니다.Select a piece of code from the list to insert it into your code and then fill in the required logic. 또한 편집기에서 사용할 사용자 고유의 사용자 지정 코드 조각을 만들 수도 있습니다.You can also create your own custom pieces of code for use in the editor.

향상된 멤버 목록List Members Enhancements. 멤버 목록 드롭다운 목록은 코드 편집기에 코드를 입력할 때 자동으로 표시됩니다.The List Members drop-down list appears automatically as you type code into the code editor. 결과가 필터링되어 사용자가 입력하는 대로 관련 멤버만 표시됩니다.Results are filtered, so that only relevant members are displayed as you type. 멤버 목록에서 사용되는 필터링 논리의 종류는 텍스트 편집기, C/C++, 고급 아래의 옵션 대화 상자에서 제어할 수 있습니다.You can control the kind of filtering logic that's used by the Member List—in the Options dialog box under Text Editor, C/C++, Advanced.

의미 체계 색 지정Semantic Colorization. 형식, 열거형, 매크로 및 다른 C++ 토큰에 대한 색이 기본적으로 지정됩니다.Types, enumerations, macros, and other C++ tokens now have colorization by default.

참조 강조 표시Reference Highlighting. 기호를 선택하면 현재 파일에서 기호의 모든 인스턴스가 강조 표시됩니다.Selecting a symbol now highlights all instances of the symbol in the current file. Ctrl+Shift+위쪽 화살표 또는 Ctrl+Shift+아래쪽 화살표를 눌러 강조 표시된 참조 간에 이동합니다.Press Ctrl+Shift+Up Arrow or Ctrl+Shift+Down Arrow to move among the highlighted references. 이 기능은 텍스트 편집기, C/C++, 고급 아래의 옵션 대화 상자에서 해제할 수 있습니다.You can turn this feature off in the Options dialog box, under Text Editor, C/C++, Advanced.

애플리케이션 수명 주기 관리 도구Application Lifecycle Management Tools

정적 코드 분석Static Code Analysis

C++에 대한 정적 분석은 더 다양한 오류 컨텍스트 정보, 더 많은 분석 규칙 및 더 나은 분석 결과를 제공하도록 업데이트되었습니다.Static analysis for C++ has been updated to provide richer error context information, more analysis rules, and better analysis results. 새 코드 분석 창에서 키워드, 프로젝트 및 심각도별로 메시지를 필터링할 수 있습니다.In the new Code Analysis window, you can filter messages by keyword, project, and severity. 창에서 메시지를 선택하면 코드 편집기에서 메시지가 트리거된 코드의 해당 줄이 강조 표시됩니다.When you select a message in the window, the line in the code where the message was triggered is highlighted in the code editor. 특정 C++ 경고의 경우 메시지에는 경고로 연결되는 실행 경로를 보여 주는 소스 줄이 나열됩니다. 의사 결정 지점 및 해당 특정 경로를 선택한 이유가 강조 표시됩니다.For certain C++ warnings, the message lists source lines that show the execution path that leads to the warning; decision points and the reasons for taking that specific path are highlighted. 코드 분석은 대부분의 Visual Studio 2012 버전에 포함되어 있습니다.Code analysis is included in most editions of Visual Studio 2012. Professional, Premium 및 Ultimate 버전에는 모든 규칙이 포함되어 있습니다.In the Professional, Premium, and Ultimate editions, all rules are included. Windows 8 및 Windows Phone용 Express 버전에는 가장 중요한 경고가 포함되어 있습니다.In the Express editions for Windows 8 and Windows Phone, just the most critical warnings are included. Web Express 버전에는 코드 분석이 포함되어 있지 않습니다.Code analysis is not included in the Express edition for Web. 다른 코드 분석에 대해 향상된 기능 중 몇 가지는 다음과 같습니다.Here are some other code analysis enhancements:

  • 새로운 동시성 경고를 사용하면 다중 스레드 C/C++ 프로그램에서 올바른 잠금 분야를 사용하고 있는지 확인하여 동시성 버그를 방지할 수 있습니다.New concurrency warnings help you avoid concurrency bugs by making sure that you are using the correct locking disciplines in multithreaded C/C++ programs. 분석기에서 잠재적 경쟁 조건, 잠금 순서 반전, 호출자/호출 수신자 잠금 계약 위반, 일치 하지 않는 동기화 작업 및 기타 동시성 버그를 검색합니다.The analyzer detects potential race conditions, lock order inversions, caller/callee locking contract violations, mismatched synchronization operations, and other concurrency bugs.
  • 규칙 집합을 사용하여 코드 분석 실행에 적용하려는 C++ 규칙을 지정할 수 있습니다.You can specify the C++ rules that you want to apply to code analysis runs by using rule sets.
  • 코드 분석 창에서 선택한 경고를 표시하지 않는 pragma를 소스 코드에 삽입할 수 있습니다.In the Code Analysis window, you can insert into the source code a pragma that suppresses a selected warning.
  • 새 버전의 Microsoft SAL(소스 코드 주석 언어)을 사용하여 함수에서 매개 변수를 사용하는 방법, 해당 매개 변수에 적용되는 가정 및 함수가 완료될 때 해당 함수에서 수행하는 보장을 설명하여 정적 코드 분석의 정확성과 완성도를 높일 수 있습니다.You can enhance the accuracy and completeness of static code analysis by using the new version of the Microsoft source-code annotation language (SAL) to describe how a function uses its parameters, the assumptions that it makes about them, and the guarantees that it makes when it finishes.
  • 64비트 C++ 프로젝트를 지원합니다.Support for 64bit C++ projects.

업데이트된 단위 테스트 프레임워크Updated Unit Test Framework

Visual Studio에서 새로운 C++ 단위 테스트 프레임워크를 사용하여 C++ 단위 테스트를 작성합니다.Use the new C++ unit test framework in Visual Studio to write C++ unit tests. 새 프로젝트 대화 상자의 Visual C++ 범주 아래에 C++ 단위 테스트 프로젝트 템플릿을 배치하여 기존 C++ 솔루션에 새 단위 테스트 프로젝트를 추가합니다.Add a new unit test project to your existing C++ solution by locating the C++ Unit Test Project template under the Visual C++ category in the New Project dialog box. Unittest1.cpp 파일에 생성된 TEST_METHOD 코드 스텁에 단위 테스트를 작성합니다.Start writing your unit tests in the generated TEST_METHOD code stub in the Unittest1.cpp file. 테스트 코드가 작성되면 솔루션을 빌드합니다.When the test code is written, build the solution. 테스트를 실행하려면 보기, 다른 창, 단위 테스트 탐색기 등을 선택하여 단위 테스트 탐색기 창을 연 다음, 원하는 테스트 사례에 대한 바로 가기 메뉴에서 선택한 테스트 실행을 선택합니다.When you want to run the tests, open a Unit Test Explorer window by choosing View, Other Windows, Unit Test Explorer, and then, on the shortcut menu for the test case you want, choose Run selected test. 테스트 실행이 완료되면 동일한 창에서 테스트 결과와 추가 스택 추적 정보를 볼 수 있습니다.After the test run finishes, you can view test results and additional stack trace information in the same window.

아키텍처 종속성 그래프Architecture Dependency Graphs

코드를 더 잘 이해하기 위해 솔루션의 이진 파일, 클래스, 네임스페이스 및 포함 파일에 대한 종속성 그래프를 생성할 수 있습니다.To understand your code better, you can now generate dependency graphs for the binary, class, namespace, and include files in a solution. 메뉴 모음에서 구조, 종속성 그래프 생성 및 솔루션 파일 또는 포함 파일을 차례로 선택하여 종속성 그래프를 생성합니다.On the menu bar, choose Architecture, Generate Dependency Graph, and then For Solution or For Include File to generate a dependency graph. 그래프 생성이 완료되면 각 노드를 펼치고, 노드 간을 이동하여 종속성 관계를 알아보고, 노드의 바로 가기 메뉴에서 콘텐츠 보기를 선택하여 소스 코드를 탐색할 수 있습니다.When the graph generation is complete, you can explore it by expanding each node, learn dependency relationships by moving between nodes, and browse source code by choosing View Content on the shortcut menu for a node. 포함 파일에 대한 종속성 그래프를 생성하려면 *.cpp 소스 코드 파일 또는 *.h 헤더 파일의 바로 가기 메뉴에서 포함 파일의 그래프 생성을 선택합니다.To generate a dependency graph for include files, on the shortcut menu for a *.cpp source code file or *.h header file, choose Generate Graph of Include Files.

아키텍처 탐색기Architecture Explorer

아키텍처 탐색기를 사용하여 C++ 솔루션, 프로젝트 또는 파일의 자산을 탐색할 수 있습니다.By using the Architecture Explorer, you can explore the assets in your C++ solution, projects, or files. 메뉴 모음에서 아키텍처, 창, 아키텍처 탐색기를 차례로 선택합니다.On the menu bar, choose Architecture, Windows, Architecture Explorer. 관심 있는 노드(예: 클래스 뷰)를 선택할 수 있습니다.You can select a node you are interested in, for example, Class View. 이 경우 도구 창의 오른쪽이 네임스페이스 목록으로 확장됩니다.In this case, the right side of the tool window is expanded with a list of namespaces. 네임스페이스를 선택하면 이 네임스페이스의 클래스, 구조체 및 열거형 목록이 새 열에 표시됩니다.If you select a namespace, a new column shows a list of the classes, structs, and enums in this namespace. 이러한 자산을 계속 탐색하거나 맨 왼쪽의 열로 돌아가서 다른 쿼리를 시작할 수 있습니다.You can continue to explore these assets, or go back to the column on the far left to start another query. "아키텍처 탐색기로 코드 찾기"를 참조하세요.See Find Code with Architecture Explorer.

코드 검사Code Coverage

코드 검사에서 런타임에 이진 파일을 동적으로 계측하도록 업데이트되었습니다.Code coverage has been updated to dynamically instrument binaries at runtime. 이렇게 하면 구성 오버헤드가 줄어들고 성능이 향상됩니다.This lowers the configuration overhead and provides better performance. 또한 C++ 앱에 대한 단위 테스트에서 코드 검사 데이터를 수집할 수도 있습니다.You can also collect code-coverage data from unit tests for C++ apps. C++ 단위 테스트를 만들었으면 단위 테스트 탐색기를 사용하여 솔루션의 테스트를 검색할 수 있습니다.When you have created C++ unit tests, you can use Unit Test Explorer to discover tests in your solution. 단위 테스트를 실행하고 단위 테스트 탐색기에서 이 테스트에 대한 코드 검사 데이터를 수집하려면 코드 검사 분석을 선택합니다.To run the unit tests and collect code coverage data for them, in Unit Test Explorer, choose Analyze Code Coverage. 메뉴 모음에서 테스트, 창, 코드 검사 결과를 차례로 선택한 다음, 코드 검사 결과 창에서 코드 적용 결과를 검사할 수 있습니다.You can examine the code coverage results in the Code Coverage Results window—on the menu bar, choose Test, Windows, Code Coverage Results.

Visual Studio 2010의 새로운 C++ 기능What's New for C++ in Visual Studio 2010

C++ 컴파일러 및 링커C++ Compiler and Linker

auto 키워드auto Keyword. auto 키워드에는 새로운 목적이 있습니다.The auto keyword has a new purpose. auto 키워드의 기본 의미를 사용하여 변수 선언의 초기화 식에서 형식이 추론되는 변수를 선언합니다.Use the default meaning of the auto keyword to declare a variable whose type is deduced from the initialization expression in the declaration of the variable. /Zc:auto 컴파일러 옵션은 auto 키워드의 새 의미 또는 이전 의미를 호출합니다.The /Zc:auto compiler option invokes either the new or the previous meaning of the auto keyword.

decltype 형식 지정자decltype Type Specifier. decltype 형식 지정자는 지정된 식의 형식을 반환합니다.The decltype type specifier returns the type of a specified expression. auto 키워드와 함께 decltype 형식 지정자를 사용하여 복합 형식 또는 컴파일러에만 알려진 형식을 선언합니다.Use the decltype type specifier in combination with the auto keyword to declare a type that is either complex or known only to the compiler. 예를 들어 조합을 사용하여 반환 형식이 해당 템플릿 인수의 형식에 따라 달라지는 템플릿 함수를 선언합니다.For example, use the combination to declare a template function whose return type depends on the types of its template arguments. 또는 다른 함수를 호출하는 템플릿 함수를 선언한 다음 호출된 함수의 반환 형식을 반환합니다.Or, declare a template function that calls another function, and then returns the return type of the called function.

람다 식Lambda Expressions. 람다 함수에는 함수 본문만 있고 이름이 없습니다.Lambda functions have a function body but no name. 람다 함수는 함수 포인터와 함수 개체의 가장 좋은 특성을 결합합니다.Lambda functions combine the best characteristics of function pointers and function objects. 람다 함수를 자체적으로 사용하거나, 함수 개체 대신 템플릿 함수 매개 변수로 사용하거나, 람다 형식의 변수를 선언하는 auto 키워드와 함께 사용합니다.Use a lambda function by itself, as a template function parameter instead of a function object, or together with the auto keyword to declare a variable whose type is a lambda.

Rvalue 참조Rvalue Reference. rvalue 참조 선언자(&&)는 rvalue에 대한 참조를 선언합니다.The rvalue reference declarator (&&) declares a reference to an rvalue. rvalue 참조를 사용하면 이동 의미 체계 및 완벽한 전달을 통해 더 효율적인 생성자, 함수 및 템플릿을 작성할 수 있습니다.An rvalue reference lets you use move semantics and perfect forwarding to write more efficient constructors, functions, and templates.

static_assert 선언static_assert Declaration. static_assert 선언은 런타임에 테스트하는 다른 어설션 메커니즘과는 달리 컴파일 타임에 소프트웨어 어설션을 테스트합니다.A static_assert declaration tests a software assertion at compile time, unlike other assertion mechanisms that test at run time. 어설션이 실패하면 컴파일이 실패하고 지정된 오류 메시지가 발생됩니다.If the assertion fails, the compilation fails and a specified error message is issued.

nullptr 및 __nullptr 키워드nullptr and __nullptr Keywords. Visual C++ 컴파일러를 사용하면 nativeptr 키워드를 네이티브 코드 또는 관리 코드와 함께 사용할 수 있습니다.The Visual C++ compiler lets you use the nullptr keyword with native code or with managed code. nullptr 키워드는 개체 핸들, 내부 포인터 또는 네이티브 포인터 형식에서 개체를 가리키지 않음을 나타냅니다.The nullptr keyword indicates that an object handle, interior pointer, or native pointer type does not point to an object. /clr 컴파일러 옵션이 사용되면 컴파일러에서 nullptr을 관리 코드로 해석하고, /clr 옵션이 사용되지 않으면 네이티브 코드로 해석합니다.The compiler interprets nullptr to be managed code when you use the /clr compiler option, and native code when you do not use the /clr option. Microsoft 특정 __nullptr 키워드는 nullptr과 같은 의미이지만 네이티브 코드에만 적용됩니다.The Microsoft-specific __nullptr keyword has the same meaning as nullptr, but it applies to native code only. /clr 컴파일러 옵션을 사용하여 네이티브 C/C++ 코드를 컴파일하면, 컴파일러에서 nullptr 키워드가 네이티브 용어인지 아니면 관리되는 용어인지 여부를 확인할 수 없습니다.If you compile native C/C++ code by using the /clr compiler option, the compiler cannot determine whether the nullptr keyword is a native or a managed term. 컴파일러에 대한 의도를 명확히 하려면, nullptr 키워드를 사용하여 관리되는 용어를 지정하고, __nullptr을 사용하여 네이티브 용어를 지정합니다.To make your intention clear to the compiler, use the nullptr keyword to specify the managed term, and __nullptr to specify the native term.

/zc: trigraphs 컴파일러 옵션/Zc:trigraphs Compiler Option. 삼중자는 기본적으로 지원되지 않습니다.By default, support for trigraphs is disabled. 삼중자 지원을 사용하려면 /Zc: trigraphs 컴파일러 옵션을 사용합니다.Use the /Zc:trigraphs compiler option to enable trigraphs support. 삼중자는 두 개의 연속 물음표(??) 뒤에 고유한 세 번째 문자로 구성됩니다.A trigraph consists of two consecutive question marks (??) followed by a unique third character. 컴파일러는 삼중자를 해당 문장 부호 문자로 바꿉니다.The compiler replaces a trigraph with the corresponding punctuation character. 예를 들어 컴파일러는 ??= 삼중자를 #(숫자 기호) 문자로 바꿉니다.For example, the compiler replaces the ??= trigraph with the # (number sign) character. 특정 문장 부호 문자가 포함되지 않은 문자 집합을 사용하는 C 소스 파일에서 삼중자를 사용합니다.Use trigraphs in C source files that use a character set that does not contain certain punctuation characters.

새 프로필 기반 최적화 옵션New Profile-Guided Optimization Option. PogoSafeMode는 응용 프로그램을 최적화할 때 안전 모드 또는 고속 모드를 사용할지 여부를 지정할 수 있는 새로운 프로필 기반 최적화 옵션입니다.PogoSafeMode is a new profile-guided optimization option that lets you specify whether to use safe mode or fast mode when you optimize your application. 안전 모드는 스레드로부터 안전하지만 고속 모드보다 더 느립니다.Safe mode is thread-safe, but it is slower than fast mode. 고속 모드가 기본 동작입니다.Fast mode is the default behavior.

새 /clr:nostdlib CLR(공용 언어 런타임) 옵션New Common Language Runtime (CLR) Option /clr:nostdlib. /clr(공용 언어 런타임 컴파일)에 대한 새 옵션이 추가되었습니다.A new option is added for /clr (Common Language Runtime Compilation). 동일한 라이브러리의 서로 다른 버전이 포함되면 컴파일 오류가 발생합니다.If different versions of the same libraries are included, a compile error is issued. 새 옵션을 사용하면 프로그램에서 지정된 버전을 사용할 수 있도록 기본 CLR 라이브러리를 제외할 수 있습니다.The new option lets you exclude the default CLR libraries so that your program can use a specified version.

새 detect_mistmatch pragma 지시문New pragma directive detect_mistmatch. detect_mismatch pragma 지시문을 사용하면 동일한 이름을 가진 다른 태그와 비교되는 태그를 파일에 추가할 수 있습니다.The pragma directive detect_mismatch lets you put a tag in your files that is compared to other tags that have the same name. 같은 이름에 대해 여러 값이 있으면 링커에서 오류가 발생합니다.If there are multiple values for the same name, the linker issues an error.

XOP, FMA4 및 LWP 내장 함수XOP Intrinsics, FMA4 Intrinsics, and LWP Intrinsics. Visual Studio 2010 SP1 프로세서 기술용으로 추가된 XOP, FMA4 및 LWP 내장 함수를 지원하는 새로운 내장 함수가 추가되었습니다.New intrinsic functions have been added to support the XOP Intrinsics Added for Visual Studio 2010 SP1, FMA4 Intrinsics Added for Visual Studio 2010 SP1, and LWP Intrinsics Added for Visual Studio 2010 SP1 processor technologies. 특정 컴퓨터에서 지원되는 프로세서 기술을 확인하려면 __cpuid, __cpuidex를 사용합니다.Use __cpuid, __cpuidex to determine which processor technologies are supported on a particular computer.

Visual C++ 프로젝트 및 빌드 시스템Visual C++ Projects and the Build System

MSBuildMSBuild. VCBuild.exe를 대체하는 MSBuild.exe를 사용하여 Visual C++ 솔루션과 프로젝트를 빌드합니다.Visual C++ solutions and projects are now built by using MSBuild.exe, which replaces VCBuild.exe. MSBuild는 다른 Visual Studio 언어 및 프로젝트 형식에서 사용되는 것과 동일한 유연하고 확장할 수 있는 XML 기반 빌드 도구입니다.MSBuild is the same flexible, extensible, XML-based build tool that is used by the other Visual Studio languages and project types. 이러한 변경에 따라 이제 Visual C++ 프로젝트 파일은 XML 파일 형식을 사용하고 .vcxproj 파일 이름 확장명을 갖습니다.Because of this change, Visual C++ project files now use an XML file format and have the .vcxproj file name extension. Visual Studio 이전 버전의 Visual C++ 프로젝트 파일은 자동으로 새 파일 형식으로 변환됩니다.Visual C++ project files from earlier versions of Visual Studio are automatically converted to the new file format.

VC++ 디렉터리VC++ Directories. VC++ 디렉터리 설정이 두 위치에 있습니다.The VC++ directories setting is now located in two places. 프로젝트 속성 페이지를 사용하여 VC++ 디렉터리에 대한 프로젝트별 값을 설정합니다.Use project property pages to set per-project values for VC++ directories. 속성 관리자 및 속성 시트를 사용하여 VC++ 디렉터리에 대한 구성별 전역 값을 설정합니다.Use the Property Manager and a property sheet to set global, per-configuration values for VC++ directories.

프로젝트 간 종속성Project-to-Project Dependencies. 이전 릴리스에서는 정의된 프로젝트 간 종속성이 솔루션 파일에 저장되었습니다.In earlier releases, defined dependencies between projects were stored in the solution file. 이러한 솔루션을 새 프로젝트 파일 형식으로 변환하면 종속성이 프로젝트 간 참조로 변환됩니다.When these solutions are converted to the new project file format, dependencies are converted to project-to-project references. 솔루션 종속성 및 프로젝트 간 참조 개념이 다르기 때문에 이러한 변경으로 인해 응용 프로그램에 영향을 줄 수 있습니다.This change can affect applications because the concepts of solution dependencies and project-to-project references are different.

매크로 및 환경 변수Macros and Environment Variables. 새로운 _ITERATOR_DEBUG_LEVEL 매크로는 반복기에 대한 디버깅 지원을 호출합니다.The new _ITERATOR_DEBUG_LEVEL macro invokes debugging support for iterators. 이 매크로는 이전의 _SECURE_SCL 및 _HAS_ITERATOR_DEBUGGING 매크로 대신 사용합니다.Use this macro instead of the older _SECURE_SCL and _HAS_ITERATOR_DEBUGGING macros.

Visual C++ 라이브러리Visual C++ Libraries

동시성 런타임 라이브러리Concurrency Runtime Libraries. 동시성 런타임 프레임워크는 동시에 실행되는 응용 프로그램과 구성 요소를 지원하며, Visual C++에서 동시 응용 프로그램을 프로그래밍하기 위한 프레임워크입니다.The Concurrency Runtime framework supports applications and components that run simultaneously, and is the framework for programming concurrent applications in Visual C++. 동시 응용 프로그램 프로그래밍을 지원하기 위해 PPL(병렬 패턴 라이브러리)에서 세분화된 병렬 처리를 수행하기 위한 범용 컨테이너와 알고리즘을 제공합니다.To support concurrent-application programming, the Parallel Patterns Library (PPL) provides general-purpose containers and algorithms for performing fine-grained parallelism. 비동기 에이전트 라이브러리는 정교하지 않은 데이터 흐름 및 파이프라인 작업에 행위자 기반 프로그래밍 모델 및 메시지 전달 인터페이스를 제공합니다.The Asynchronous Agents Library provides an actor-based programming model and message passing interfaces for coarse-grained dataflow and pipelining tasks.

표준 C++ 라이브러리Standard C++ Library. 다음 목록에서는 표준 C++ 라이브러리에 적용된 다양한 변경 내용에 대해 설명합니다.The following list describes many of the changes that have been made to the Standard C++ Library.

  • 새로운 rvalue 참조 C++ 언어 기능이 표준 템플릿 라이브러리의 다양한 기능에 대한 이동 의미 체계 및 완벽한 전달을 구현하는 데 사용됩니다.The new rvalue reference C++ language feature has been used to implement move semantics and perfect forwarding for many functions in the Standard Template Library. 이동 의미 체계 및 완벽한 전달은 변수 또는 매개 변수를 할당하는 작업의 성능을 크게 향상시킵니다.Move semantics and perfect forwarding greatly improve the performance of operations that allocate or assign variables or parameters.
  • rvalue 참조는 auto_ptr 클래스보다 더 안전한 스마트 포인터 형식인 new_ptr 클래스를 구현하는 데에도 사용됩니다.Rvalue references are also used to implement the new unique_ptr class, which is a safer smart pointer type than the auto_ptr class. unique_ptr 클래스는 이동할 수 있지만 복사할 수는 없으며, 안전성에 영향을 주지 않고 엄격한 소유권 의미 체계를 구현하고, rvalue 참조를 인식하는 컨테이너에서 잘 작동합니다.The unique_ptr class is movable but not copyable, implements strict ownership semantics without affecting safety, and works well with containers that are aware of rvalue references. auto_ptr 클래스는 더 이상 사용되지 않습니다.The auto_ptr class is deprecated.
  • find_if_not, copy_if 및 is_sorted 등 15개의 새로운 함수가 <algorithm> 헤더에 추가되었습니다.Fifteen new functions, for example, find_if_not, copy_if, and is_sorted, have been added to the <algorithm> header.
  • <memory> 헤더에서 새 make_shared 함수는 개체가 생성되는 동시에 개체에 대한 공유 포인터를 만드는 강력하고 편리한 효율적인 방법입니다.In the <memory> header, the new make_shared function is a convenient, robust, and efficient way to make a shared pointer to an object at the same time the object is constructed.
  • <forward_list> 헤더에서 단일 연결된 목록이 지원됩니다.Singly linked lists are supported by the <forward_list> header.
  • 새 cbegin, cend, crbegin 및 crend 멤버 함수는 컨테이너를 통해 앞뒤로 이동하는 const_iterator를 제공합니다.The new cbegin, cend, crbegin, and crend member functions provide a const_iterator that moves forward or backward through a container.
  • <system_error> 헤더 및 관련 템플릿은 낮은 수준의 시스템 오류를 처리하도록 지원합니다.The <system_error> header and related templates support the processing of low-level system errors. exception_ptr 클래스의 멤버는 스레드 간에 예외를 전송하는 데 사용할 수 있습니다.Members of the exception_ptr class can be used to transport exceptions between threads.
  • <codecvt> 헤더는 다양한 유니코드 문자 인코딩을 다른 인코딩으로 변환하도록 지원합니다.The <codecvt> header supports converting various encodings of Unicode characters to other encodings.
  • <allocators> 헤더는 노드 기반 컨테이너에 메모리 블록을 할당하거나 할당 취소하는 데 도움이 되는 몇 가지 템플릿을 정의합니다.The <allocators> header defines several templates that help allocate and free memory blocks for node-based containers.
  • <random> 헤더에 대한 많은 업데이트가 있습니다.There are numerous updates to the <random> header.

MFC(Microsoft Foundation Class) 라이브러리Microsoft Foundation Class (MFC) Library

Windows 7 기능Windows 7 Features. MFC는 리본 UI(사용자 인터페이스), 작업 표시줄, 점프 목록, 탭 미리 보기, 축소판 그림 미리 보기, 진행률 표시줄, 아이콘 오버레이 및 검색 인덱싱과 같은 다양한 Windows 7 기능을 지원합니다.MFC supports many Windows 7 features, for example, the Ribbon user interface (UI), the Taskbar, jump lists, tabbed thumbnails, thumbnail previews, the progress bar, icon overlay, and search indexing. MFC에서 다양한 Windows 7 기능을 자동으로 지원하므로 기존 응용 프로그램을 수정할 필요가 없습니다.Because MFC automatically supports many Windows 7 features, you may not have to modify your existing application. 새 응용 프로그램의 다른 기능을 지원하려면 MFC 응용 프로그램 마법사를 사용하여 사용하려는 기능을 지정합니다.To support other features in new applications, use the MFC Application Wizard to specify the functionality you want to use.

멀티 터치 인식Multi-touch Awareness. MFC는 멀티 터치 사용자 인터페이스가 있는 응용 프로그램(예: Microsoft Surface 운영 체제용으로 작성된 응용 프로그램)을 지원합니다.MFC supports applications that have a multi-touch user interface, for example, applications that are written for the Microsoft Surface operating system. 멀티 터치 응용 프로그램에서 터치 메시지의 조합인 Windows 터치 메시지와 제스처 메시지를 처리할 수 있습니다.A multi-touch application can handle Windows touch messages and gesture messages, which are combinations of touch messages. 터치 및 제스처 이벤트에 대한 응용 프로그램을 등록하기만 하면 운영 체제에서 멀티 터치 이벤트를 이벤트 처리기로 라우팅합니다.Just register your application for touch and gesture events and the operating system will route multi-touch events to your event handlers.

높은 DPI 인식High-DPI Awareness. MFC 응용 프로그램은 기본적으로 높은 DPI를 인식합니다.By default, MFC applications are now High-DPI-aware. 응용 프로그램이 높은 DPI(인치당 높은 도트 수)를 인식하는 경우 운영 체제에서 창, 텍스트 및 다른 UI 요소를 현재 화면 해상도에 맞게 조정할 수 있습니다.If an application is High-DPI (high dots per inch) aware, the operating system can scale windows, text, and other UI elements to the current screen resolution. 즉 배율이 지정된 이미지가 올바르게 배치되고 클리핑되거나 픽셀화되지 않을 수 있습니다.This means that a scaled image is more likely to be correctly laid out, and not clipped or pixelated.

다시 시작 관리자Restart Manager. 예기치 않게 닫히거나 다시 시작되는 경우 다시 시작 관리자에서 자동으로 문서를 저장하고 응용 프로그램을 다시 시작합니다.The restart manager automatically saves documents and restarts your application if it unexpectedly closes or restarts. 예를 들어 자동 업데이트로 인해 응용 프로그램이 닫히면 다시 시작 관리자를 사용하여 해당 응용 프로그램을 시작할 수 있습니다.For example, you can use the restart manager to start your application after it is closed by an automatic update. 다시 시작 관리자를 사용하도록 응용 프로그램을 구성하는 방법에 대한 자세한 내용은 "방법: 다시 시작 관리자 지원 추가"를 참조하세요.For more information about how to configure your application to use the restart manager, see How to: Add Restart Manager Support.

CTaskDialogCTaskDialog. CTaskDialog 클래스는 표준 AfxMessageBox 메시지 상자 대신 사용할 수 있습니다.The CTaskDialog class can be used instead of the standard AfxMessageBox message box. 표준 메시지 상자보다 더 많은 정보를 표시하고 수집합니다.The CTaskDialog class displays and gathers more information than the standard message box does.

SafeInt 라이브러리SafeInt Library

새로운 SafeInt 라이브러리는 정수 오버플로를 고려하는 안전한 산술 연산을 수행합니다.The new SafeInt Library performs safe arithmetic operations that account for integer overflow. 또한 이 라이브러리는 다른 종류의 정수도 비교합니다.This library also compares different kinds of integers.

새로운 ATL(액티브 템플릿 라이브러리) 매크로New Active Template Library (ATL) macros

PROP_ENTRY_TYPE 및 PROP_ENTRY_TYPE_EX 기능을 확장하기 위해 새 매크로가 ATL에 추가되었습니다.New macros have been added to ATL to expand the functionality of PROP_ENTRY_TYPE and PROP_ENTRY_TYPE_EX. PROP_ENTRY_INTERFACE 및 PROP_ENTRY_INTERFACE_EX를 사용하면 유효한 CLSID 목록을 추가할 수 있습니다.PROP_ENTRY_INTERFACE and PROP_ENTRY_INTERFACE_EX let you add a list of valid CLSIDs. PROP_ENTRY_INTERFACE_CALLBACK 및 PROP_ENTRY_INTERFACE_CALLBACK_EX를 사용하면 CLSID가 유효한지 여부를 결정하는 콜백 함수를 지정할 수 있습니다.PROP_ENTRY_INTERFACE_CALLBACK and PROP_ENTRY_INTERFACE_CALLBACK_EX let you specify a callback function to determine whether a CLSID is valid.

/analyze 경고/analyze Warnings

대부분의 /analyze(엔터프라이즈 코드 분석) 경고가 CRT(C 런타임), MFC 및 ATL 라이브러리에서 제거되었습니다.Most /analyze (Enterprise Code Analysis) warnings have been removed from the C Run-Time (CRT), MFC, and ATL libraries.

애니메이션 및 D2D 지원Animation and D2D support

MFC는 애니메이션과 Direct2D 그래픽을 지원합니다.MFC now supports animation and Direct2D graphics. MFC 라이브러리에는 이 기능을 지원하는 몇 가지 새로운 MFC 클래스와 함수가 있습니다.The MFC library has several new MFC classes and functions to support this functionality. 또한 D2D 개체와 애니메이션 개체를 프로젝트에 추가하는 방법을 보여 주는 두 가지의 새로운 연습이 있습니다.There are also two new walkthroughs to show how to add a D2D object and an animation object to a project. 이러한 연습은 "연습: MFC 프로젝트에 D2D 개체 추가" 및 "연습: MFC 프로젝트에 애니메이션 추가"입니다.These walkthroughs are Walkthrough: Adding a D2D Object to an MFC Project and Walkthrough: Adding Animation to an MFC Project.

IDEIDE

향상된 IntelliSenseImproved IntelliSense. Visual C++용 IntelliSense는 더 빠르고 정확하며 더 큰 프로젝트를 처리할 수 있도록 완전히 새롭게 디자인되었습니다.IntelliSense for Visual C++ has been completely redesigned to be faster, more accurate, and able to handle larger projects. 이러한 향상을 얻기 위해 IDE에서는 개발자가 소스 코드를 보고 수정하는 방법과 IDE에서 소스 코드 및 프로젝트 설정을 사용하여 솔루션을 빌드하는 방법을 구분합니다.To achieve this improvement, the IDE makes a distinction between how a developer views and modifies source code, and how the IDE uses source code and project settings to build a solution. 이러한 업무 분리에 따라 검색 기능(예: 클래스 뷰 및 새 탐색 대상 대화 상자)이 컴파일되지 않는 이전의 찾아보기 파일(.ncb)을 대체하는 새로운 SQL Server 데스크톱 데이터베이스 파일(.sdf)을 기반으로 하는 시스템에서 처리됩니다.Because of this separation of duties, browsing features such as Class View and the new Navigate To dialog box are handled by a system that is based on a new SQL Server desktop database (.sdf) file that replaces the old no compile browse (.ncb) file. 요약 정보, 자동 완성 및 매개 변수 도움말과 같은 IntelliSense 기능은 필요한 경우에만 변환 단위를 구문 분석합니다.IntelliSense features such as Quick Information, Auto Completion, and Parameter Help parse translation units only when required. 새로운 호출 계층 구조 창과 같은 하이브리드 기능은 찾아보기와 IntelliSense 기능을 결합하여 사용합니다.Hybrid features such as the new Call Hierarchy window use a combination of the browse and IntelliSense features. IntelliSense는 현재 필요한 정보만 처리하므로 IDE의 응답성이 향상됩니다.Because IntelliSense processes only the information that you require at the moment, the IDE is more responsive. 또한 최신 정보이므로 IDE 뷰 및 창이 더욱 정확합니다.Also, because information is more up to date, IDE views and windows are more accurate. 마지막으로 IDE 인프라가 더 효율적으로 구성되고, 관련 기능이 다양하고, 확장성이 뛰어나므로 더 큰 프로젝트를 처리할 수 있습니다.Finally, because the IDE infrastructure is better organized, more capable, and more scalable, it can handle larger projects.

향상된 IntelliSense 오류Improved IntelliSense Errors. IDE는 IntelliSense가 손실될 수 있는 오류를 더 효율적으로 검색하고 그 아래에 빨간색 물결선 밑줄을 표시합니다.The IDE better detects errors that could cause a loss of IntelliSense and displays red wavy underlines under them. 또한 IDE는 IntelliSense 오류를 오류 목록 창에 보고합니다.In addition, the IDE reports IntelliSense errors to the Error List Window. 문제가 발생되는 코드를 표시하려면 오류 목록 창에서 해당 오류를 두 번 클릭합니다.To display the code that is causing the problem, double-click the error in the Error List Window.

#include 자동 완성 기능#include Auto-Complete Feature. IDE는 #include 키워드에 대한 자동 완성 기능을 지원합니다.The IDE supports auto-completion for the #include keyword. #include를 입력하면 IDE에서 유효한 헤더 파일의 드롭다운 목록 상자를 만듭니다.When you type #include, the IDE creates a drop-down list box of valid header files. 파일 이름을 입력하여 계속하면 IDE에서 입력한 내용에 기반하여 목록을 필터링합니다.If you continue by typing a file name, the IDE filters the list based on your entry. 언제든지 목록에서 포함할 파일을 선택할 수 있습니다.At any point, you can select from the list the file you want to include. 이렇게 하면 정확한 파일 이름을 알지 못해도 파일을 빠르게 포함할 수 있습니다.This lets you quickly include files without knowing the exact file name.

탐색Navigate To. 탐색 대상 대화 상자를 사용하면 프로젝트에서 지정된 문자열과 일치하는 모든 기호와 파일을 검색할 수 있습니다.The Navigate To dialog box lets you search for all symbols and files in your project that match a specified string. 검색 문자열에 추가 문자를 입력하는 대로 검색 결과가 바로 수정됩니다.Search results are immediately revised as you type additional characters in your search string. 결과 피드백 필드에는 찾은 항목의 수가 표시되고, 이를 통해 검색을 제한할지 여부를 결정할 수 있습니다.The Results feedback field tells you the number of items found and helps you decide whether to constrain your search. 종류/범위, 위치 및 미리 보기 피드백 필드를 사용하면 비슷한 이름의 항목을 쉽게 구분할 수 있습니다.The Kind/Scope, Location, and Preview feedback fields help you disambiguate items that have similar names. 또한 이 기능을 확장하여 다른 프로그래밍 언어도 지원할 수 있습니다.In addition, you can extend this feature to support other programming languages.

병렬 디버깅 및 프로파일링Parallel Debugging and Profiling. Visual Studio 디버거는 동시성 런타임을 인식하고 병렬 처리 응용 프로그램의 문제를 해결하는 데 도움을 줍니다.The Visual Studio debugger is aware of the Concurrency Runtime and helps you troubleshoot parallel processing applications. 새 동시성 프로파일러 도구를 사용하여 응용 프로그램의 전체 동작을 시각화할 수 있습니다.You can use the new concurrency profiler tool to visualize the overall behavior of your application. 또한 새 도구 창을 사용하여 작업 및 해당 호출 스택의 상태도 시각화할 수 있습니다.Also, you can use new tool windows to visualize the state of tasks and their call stacks.

리본 디자이너Ribbon Designer. 리본 디자이너는 MFC 리본 UI를 만들고 수정할 수 있는 그래픽 편집기입니다.The Ribbon Designer is a graphical editor that lets you create and modify an MFC ribbon UI. 최종 리본 UI는 XML 기반 리소스 파일(.mfcribbon-ms)로 표현됩니다.The final ribbon UI is represented by an XML-based resource file (.mfcribbon-ms). 기존 응용 프로그램의 경우 몇 줄의 코드를 임시로 추가한 다음 리본 디자이너를 호출하여 현재 리본 UI를 캡처할 수 있습니다.For existing applications, you can capture your current ribbon UI by temporarily adding a few lines of code and then invoking the Ribbon Designer. 리본 리소스 파일이 만들어지면 손으로 쓴 리본 UI 코드를 리본 리소스가 로드되는 몇 개의 명령문으로 바꿀 수 있습니다.After the ribbon resource file is created, you can replace your handwritten ribbon UI code with a few statements that load the ribbon resource.

호출 계층 구조Call Hierarchy. 호출 계층 구조 창에서는 특정 함수 또는 특정 함수를 호출하는 모든 함수로 호출되는 함수를 모두 탐색할 수 있습니다.The Call Hierarchy window lets you navigate to all functions that are called by a particular function, or to all functions that call a particular function.

도구Tools

MFC 클래스 마법사MFC Class Wizard. Visual C++ 2010에서는 잘 알려진 MFC 클래스 마법사 도구를 다시 가져옵니다.Visual C++ 2010 brings back the well-regarded MFC Class Wizard tool. MFC 클래스 마법사는 소스 파일 집합을 수동으로 수정하지 않고도 클래스, 메시지 및 변수를 프로젝트에 추가할 수 있는 편리한 방법입니다.The MFC Class Wizard is a convenient way to add classes, messages, and variables to a project without having to manually modify sets of source files.

ATL 컨트롤 마법사ATL Control Wizard. ATL 컨트롤 마법사는 더 이상 ProgID 필드를 자동으로 채우지 않습니다.The ATL Control Wizard no longer automatically populates the ProgID field. ATL 컨트롤에 ProgID가 없으면 다른 도구가 이 도구와 작동하지 않을 수 있습니다.If an ATL control does not have a ProgID, other tools may not work with it. 컨트롤에 ProgID가 있어야 하는 도구의 한 예로 활성 컨트롤 삽입 대화 상자가 있습니다.One example of a tool that requires controls to have a ProgID is the Insert Active Control dialog box. 대화 상자에 대한 자세한 내용은 "ActiveX 컨트롤 삽입 대화 상자"를 참조하세요.For more information about the dialog box, see Insert ActiveX Control Dialog Box.

Microsoft 매크로 어셈블러 참조Microsoft Macro Assembler Reference

YMMWORD 데이터 형식을 추가하면 Intel AVX(고급 벡터 확장) 명령에 포함된 256비트 멀티미디어 피연산자를 지원합니다.The addition of the YMMWORD data type supports the 256-bit multimedia operands that are included in the Intel Advanced Vector Extensions (AVX) instructions.

Visual Studio 2008의 새로운 C++ 기능What's New for C++ in Visual Studio 2008

Visual C# IDE(통합 개발 환경)Visual C++ Integrated Development Environment (IDE)

  • ATL, MFC 및 Win32 응용 프로그램에서 만든 대화 상자는 이제 Windows Vista 스타일 지침을 준수합니다.Dialog boxes that are created in ATL, MFC, and Win32 applications now comply with the Windows Vista style guidelines. Visual Studio 2008을 사용하여 새 프로젝트를 만드는 경우 응용 프로그램에 삽입하는 모든 대화 상자는 Windows Vista 스타일 지침을 따릅니다.When you create a new project by using Visual Studio 2008, all dialog boxes that you insert into your application will comply with the Windows Vista style guideline. 이전 버전의 Visual Studio를 사용하여 만든 프로젝트를 다시 컴파일하면 기존 대화 상자에서 이전과 동일한 모양을 유지합니다.If you recompile a project that you created with an earlier version of Visual Studio, any existing dialog boxes will maintain the same look that they previously had. 대화 상자를 응용 프로그램에 삽입하는 방법에 대한 자세한 내용은 "대화 상자 편집기"를 참조하세요.For more information about how to insert dialog boxes into your application, see Dialog Editor.

  • ATL 프로젝트 마법사에는 이제 모든 사용자에 대한 구성 요소를 등록하는 옵션이 있습니다.The ATL Project wizard now has an option to register components for all users. Visual Studio 2008부터 모든 사용자에 대한 구성 요소 등록을 선택하지 않으면, ATL 프로젝트 마법사에서 만든 COM 구성 요소 및 형식 라이브러리가 레지스트리의 HKEY_CURRENT_USER 노드에 등록됩니다.Beginning with Visual Studio 2008, the COM components and type libraries that are created by the ATL Project wizard are registered in the HKEY_CURRENT_USER node of the registry unless you select Register component for all users.

  • ATL 프로젝트 마법사는 더 이상 특성 사용 ATL 프로젝트를 만드는 옵션을 제공하지 않습니다.The ATL Project wizard no longer provides an option to create attributed ATL projects. Visual Studio 2008부터 ATL 프로젝트 마법사에는 새 프로젝트의 특성 사용 상태를 변경할 수 있는 옵션이 없습니다.Beginning with Visual Studio 2008, the ATL Project wizard does not have an option to change the attributed status of a new project. 이제 마법사에서 만드는 새 ATL 프로젝트는 모두 특성을 사용하지 않습니다.All new ATL projects that the wizard creates are now unattributed.
  • 레지스트리에 대한 쓰기를 리디렉션할 수 있습니다.Writing to the registry can be redirected. Windows Vista가 도입됨에 따라 레지스트리의 특정 영역에 대한 쓰기에서는 프로그램을 관리자 모드에서 실행해야 합니다.With the introduction of Windows Vista, writing to certain areas of the registry requires a program to run in elevated mode. 항상 관리자 모드에서 Visual Studio를 실행하지 않는 것이 좋습니다.It is not desirable to always run Visual Studio in elevated mode. 사용자별 리디렉션은 프로그래밍을 변경하지 않고 자동으로 레지스트리 쓰기를 HKEY_CLASSES_ROOT에서 HKEY_CURRENT_USER로 리디렉션합니다.Per-user redirection automatically redirects registry writes from HKEY_CLASSES_ROOT to HKEY_CURRENT_USER without any programming changes.
  • 클래스 디자이너에서 네이티브 C++ 코드에 대한 지원이 제한됩니다.The Class Designer now has limited support for native C++ code. 이전 버전의 Visual Studio에서 클래스 디자이너는 Visual C # 및 Visual Basic에서만 작동했습니다.In earlier versions of Visual Studio, the Class Designer worked only with Visual C# and Visual Basic. C++ 사용자는 이제 읽기 전용 모드에서만 클래스 디자이너를 사용할 수 있습니다.C++ users can now use the Class Designer, but only in read-only mode. C++에서 클래스 디자이너를 사용하는 방법에 대한 자세한 내용은 "클래스 디자이너에서 Visual C++ 코드를 사용하여 작업"을 참조하세요.For more information about how to use the Class Designer with C++, see Working with Visual C++ Code in Class Designer.
  • 프로젝트 마법사에는 더 이상 C++ SQL Server 프로젝트를 만들 수 있는 옵션이 없습니다.The project wizard no longer has an option to create a C++ SQL Server project. Visual Studio 2008부터 새 프로젝트 마법사에 C++ SQL Server 프로젝트를 만드는 옵션이 없습니다.Beginning with Visual Studio 2008, the new project wizard does not have an option to create a C++ SQL Server project. 이전 버전의 Visual Studio를 사용하여 만든 SQL Server 프로젝트는 제대로 컴파일되고 작동합니다.SQL Server projects created by using an earlier version of Visual Studio will still compile and work correctly.

Visual C++ 라이브러리Visual C++ Libraries

일반General

  • 응용 프로그램은 특정 버전의 Visual C++ 라이브러리에 바인딩될 수 있습니다.Applications can be bound to specific versions of the Visual C++ libraries. 경우에 따라 릴리스 후에 Visual C++ 라이브러리의 업데이트에 따라 응용 프로그램이 달라집니다.Sometimes an application depends on updates that were made to the Visual C++ libraries after a release. 이 경우 이전 버전의 라이브러리가 있는 컴퓨터에서 응용 프로그램을 실행하면 예기치 않은 동작이 발생할 수 있습니다.In this case, running the application on a computer that has earlier versions of the libraries can cause unexpected behavior. 이제 응용 프로그램을 특정 버전의 라이브러리에 바인딩하여 이전 버전의 라이브러리가 있는 컴퓨터에서 실행되지 않도록 할 수 있습니다.You can now bind an application to a specific version of the libraries so that it will not run on a computer that has an earlier version of the libraries.

STL/CLR 라이브러리STL/CLR Library

  • 이제 STL/CLR 라이브러리가 Visual C++에 포함되어 있습니다.Visual C++ now includes the STL/CLR Library. STL/CLR 라이브러리는 C++ 및 .NET Framework CLR(공용 언어 런타임)에서 사용하기 위한 표준 C++ 라이브러리의 하위 집합인 STL(표준 템플릿 라이브러리) 패키지입니다.The STL/CLR Library is a packaging of the Standard Template Library (STL), a subset of the Standard C++ Library, for use with C++ and the .NET Framework common language runtime (CLR). STL/CLR을 사용하면 관리되는 환경에서 STL의 모든 컨테이너, 반복기 및 알고리즘을 사용할 수 있습니다.With STL/CLR, you can now use all the containers, iterators, and algorithms of STL in a managed environment.

MFC 라이브러리MFC Library

  • Windows Vista는 일반 컨트롤을 지원합니다.Windows Vista supports Common Controls. Windows Vista의 기능을 지원하거나 현재 MFC 클래스의 기능을 향상시키기 위해 18개의 새 클래스 또는 기존 클래스에 150개 이상의 메서드가 추가되었습니다.Over 150 methods in 18 new or existing classes have been added to support features in Windows Vista, or to improve functionality in current MFC classes.
  • 새 CNetAddressCtrl 클래스를 사용하면 IPv4 및 IPv6 주소 또는 DNS 이름을 입력하고 유효성을 검사할 수 있습니다.The new CNetAddressCtrl class enables you to input and validate IPv4 and IPv6 addresses or DNS names.
  • 새 CPagerCtrl 클래스는 Windows Pager 컨트롤의 사용을 간소화합니다.The new CPagerCtrl class simplifies use of the Windows pager control.
  • 새 CSplitButton 클래스를 사용하면 Windows SplitButton 컨트롤을 사용하여 기본 또는 선택적 동작을 쉽게 선택할 수 있습니다.The new CSplitButton class simplifies the use of the Windows splitbutton control to select a default or optional action.

C++ 지원 라이브러리C++ Support Library

  • C++은 마샬링 라이브러리를 도입했습니다.C++ introduces the marshaling library. 마샬링 라이브러리는 네이티브 환경과 관리되는 환경 간에 데이터를 마샬링하는 쉽고 최적화된 방법을 제공합니다.The marshaling library provides an easy and optimized way to marshal data between native and managed environments. 이 라이브러리는 PInvoke 사용과 같이 더 복잡하고 덜 효율적인 방법에 대한 대안입니다.The library is an alternative to more complex and less efficient approaches such as Using PInvoke. 자세한 내용은 "C++ 마샬링 개요"를 참조하세요.See Overview of Marshaling in C++ for more information.

ATL 서버ATL Server

  • ATL 서버는 공유 소스 프로젝트로 릴리스됩니다.ATL Server is released as a shared source project.
  • 대부분의 ATL Server 코드베이스는 CodePlex에서 공유 소스 프로젝트로 릴리스되었으며, Visual Studio 2008의 일부로는 설치되지 않습니다.Most of the ATL Server code base has been released as a shared source project on CodePlex and is not installed as part of Visual Studio 2008. ATL 서버와 관련된 여러 파일이 더 이상 Visual Studio의 일부로 제공되지 않습니다.Several files associated with ATL Server are no longer part of Visual Studio. 제거된 파일 목록은" 제거된 ATL 서버 파일"을 참조하세요.For the list of removed files, see Removed ATL Server Files.
  • atlenc.h의 데이터 인코딩 및 디코딩 클래스와 atlutil.h 및 atlpath.h의 유틸리티 함수 및 클래스는 이제 ATL 라이브러리의 일부입니다.Data encoding and decoding classes from atlenc.h and utility functions and classes from atlutil.h and atlpath.h are now part of the ATL library.
  • 이전 버전의 Visual Studio 버전이 지원되는 한 이러한 버전에 포함된 ATL Server 버전은 계속 지원됩니다.Microsoft will continue to support versions of ATL Server that are included in earlier releases of Visual Studio as long as those versions of Visual Studio are supported. CodePlex에서는 ATL 서버 코드가 커뮤니티 프로젝트로 계속 개발됩니다.CodePlex will continue development of the ATL Server code as a community project. Microsoft는 ATL Server의 CodePlex 버전을 지원하지 않습니다.Microsoft does not support a CodePlex version of ATL Server.

Visual C++ 컴파일러 및 링커Visual C++ Compiler and Linker

컴파일러 변경 내용Compiler Changes

  • 컴파일러는 관리되는 증분 빌드를 지원합니다.The compiler supports managed incremental builds. 이 옵션을 지정하면 참조된 어셈블리가 변경될 때 컴파일러에서 코드를 다시 컴파일하지 않습니다.When you specify this option, the compiler will not recompile code when a referenced assembly changes. 대신 증분 빌드를 수행합니다.Instead it will perform an incremental build. 변경 내용이 종속 코드에 적용되는 경우에만 파일이 다시 컴파일됩니다.Files are recompiled only if the changes affect the dependent code.
  • ATL 서버와 관련된 특성은 더 이상 지원되지 않습니다.Attributes related to ATL Server are no longer supported. 컴파일러는 ATL 서버와 직접 관련된 여러 특성을 더 이상 지원하지 않습니다.The compiler no longer supports several attributes that were directly related to ATL Server. 제거된 특성의 전체 목록은 "주요 변경 내용"을 참조하세요.For a complete list of the removed attributes, see Breaking Changes.
  • 컴파일러는 Intel Core microarchitecture를 지원합니다.The compiler supports Intel Core microarchitecture. 컴파일러에는 코드 생성 중에 Intel Core microarchitecture 튜닝이 포함됩니다.The compiler contains tuning for the Intel Core microarchitecture during code generation. 이 튜닝은 기본적으로 사용되며 Pentium 4 및 다른 프로세서에도 도움이 되므로 비활성화할 수 없습니다.By default, this tuning is on and cannot be disabled as it also helps Pentium 4 and other processors.
  • 내장 함수에는 최신 AMD 및 Intel 프로세서가 지원됩니다.Intrinsics support newer AMD and Intel processors. 몇 가지 새로운 내장 명령이 최신 AMD 및 Intel 프로세서에서 더 많은 기능을 지원합니다.Several new intrinsic instructions support the greater functionality in more recent AMD and Intel processors. 새로운 내장 함수에 대한 자세한 내용은 "Supplemental Streaming SIMD Extensions 3 Instructions", "Streaming SIMD Extensions 4 Instructions", "SSE4A and Advanced Bit Manipulation Intrinsics", "AES Intrinsics", _mm_clmulepi64_si128 및 __rdtscp를 참조하세요.For more information about the new intrinsics, see Supplemental Streaming SIMD Extensions 3 Instructions, Streaming SIMD Extensions 4 Instructions, SSE4A and Advanced Bit Manipulation Intrinsics, AES Intrinsics, _mm_clmulepi64_si128, and __rdtscp.
  • __cpuid 함수가 업데이트되었습니다.The __cpuid function is updated. __cpuid, __cpuidex 함수는 AMD 및 Intel 프로세서의 최신 수정 버전에서 몇 가지 새로운 기능을 지원합니다.The __cpuid, __cpuidex functions now support several new features from the latest revisions of AMD and Intel processors. 새 __cpuidex 내장 함수는 최신 프로세서에서 자세한 정보를 수집합니다.The __cpuidex intrinsic is new and gathers more information from recent processors.
  • /MP 컴파일러 옵션은 전체 빌드 시간을 줄여줍니다.The /MP compiler option reduces total build time. /MP 옵션을 사용하면 파일을 동시에 컴파일하는 여러 프로세스를 만들어 여러 소스 파일을 컴파일하는 데 걸리는 총 시간을 크게 줄일 수 있습니다.The /MP option can significantly reduce the total time to compile several source files by creating several processes that compile the files simultaneously. 이 옵션은 특히 하이퍼스레딩, 다중 프로세서 또는 다중 코어를 지원하는 컴퓨터에서 특히 유용합니다.This option is especially useful on computers that support hyperthreading, multiple processors, or multiple cores.
  • /Wp64 컴파일러 옵션과 __w64 키워드는 더 이상 사용되지 않습니다.The /Wp64 compiler option and __w64 keyword are deprecated. 64비트 이식성 문제를 검색하는 /Wp64 컴파일러 옵션과 __w64 키워드는 더 이상 사용되지 않으며, 이후 버전의 컴파일러에서 제거됩니다.The /Wp64 compiler option and __w64 keyword, which detect 64-bit portability issues, are deprecated and will be removed in a future version of the compiler. 이 컴파일러 옵션과 키워드 대신 64비트 플랫폼을 대상으로 하는 Visual C++ 컴파일러를 사용합니다.Instead of this compiler option and keyword, use a Visual C++ compiler that targets a 64-bit platform.
  • /Qfast_transcendentals는 초월 함수에 대한 인라인 코드를 생성합니다./Qfast_transcendentals generates inline code for transcendental functions.
  • /Qprecise_fwaits는 /fp:except 컴파일러 옵션을 사용할 때 try 블록에 대한 fwait 내부 명령을 제거합니다./Qimprecise_fwaits removes the fwait commands internal to try blocks when you use the /fp:except compiler option.

링커 변경 내용Linker Changes

  • 사용자 계정 컨트롤 정보가 Visual C++ 링커(link.exe)를 통해 실행 파일에 대한 매니페스트 파일에 포함됩니다.User Account Control information is now embedded into manifest files for executables by the Visual C++ linker (link.exe). 이 기능은 기본적으로 활성화되어 있습니다.This feature is enabled by default. 이 기능을 사용 하지 않도록 설정하는 방법 또는 기본 동작을 수정하는 방법에 대한 자세한 내용은 "/MANIFESTUAC(매니페스트에 UAC 정보 포함)"를 참조하세요.For more information about how to disable this feature, or how to modify the default behavior, see /MANIFESTUAC (Embeds UAC information in manifest).
  • 링커에는 Windows Vista의 ASLR(Address Space Layout Randomization) 기능을 사용하도록 설정할 수 있는 /DYNAMICBASE 옵션이 있습니다.The linker now has the /DYNAMICBASE option to enable the Address Space Layout Randomization feature of Windows Vista. 이 옵션은 로드 시 응용 프로그램을 임의로 다시 지정하는지 여부를 나타내기 위해 실행 파일의 헤더를 수정합니다.This option modifies the header of an executable to indicate whether the application should be randomly rebased at load time.

Visual Studio 2005의 새로운 C++ 기능What's New for C++ in Visual Studio 2005

Visual C++ 2005 서비스 팩 1에서 새로 추가된 기능은 다음과 같습니다.The following features were new in Visual C++ 2005 Service Pack 1:

x86 및 x64 내장 함수Intrinsics for x86 and x64

  • __halt__halt
  • __lidt__lidt
  • __nop__nop
  • __readcr8__readcr8
  • __sidt__sidt
  • __svm_clgi__svm_clgi
  • __svm_invlpga__svm_invlpga
  • __svm_skinit__svm_skinit
  • __svm_stgi__svm_stgi
  • __svm_vmload__svm_vmload
  • __svm_vmrun__svm_vmrun
  • __svm_vmsave__svm_vmsave
  • __ud2__ud2
  • __vmx_off__vmx_off
  • __vmx_vmptrst__vmx_vmptrst
  • __writecr8__writecr8

x64 전용 내장 함수Intrinsics for x64 Only

  • __vmx_on__vmx_on
  • __vmx_vmclear__vmx_vmclear
  • __vmx_vmlaunch__vmx_vmlaunch
  • __vmx_vmptrld__vmx_vmptrld
  • __vmx_vmread__vmx_vmread
  • __vmx_vmresume__vmx_vmresume
  • __vmx_vmwrite__vmx_vmwrite

새 언어 키워드New Language Keywords

__sptr, __uptr__sptr, __uptr

새 컴파일러 기능New Compiler Features

이 릴리스의 컴파일러에는 주요 변경 내용이 있습니다.The compiler has breaking changes in this release.

  • 64비트 네이티브 및 크로스 컴파일러`64-bit native and cross-compilers.
  • /analyze(엔터프라이즈 코드 분석) 컴파일러 옵션이 추가되었습니다./analyze (Enterprise Code Analysis) compiler option has been added.
  • /bigobj 컴파일러 옵션이 추가되었습니다./bigobj compiler option has been added.
  • /clr:pure, /clr:safe 및 /clr:oldSyntax가 추가되었습니다./clr:pure, /clr:safe, and /clr:oldSyntax have been added.
  • 사용되지 않는 컴파일러 옵션: 이 릴리스에서는 많은 컴파일러 옵션이 더 이상 사용되지 않습니다. 자세한 내용은 "사용되지 않는 컴파일러 옵션"을 참조하세요.Deprecated compiler options: many compiler options have been deprecated in this release; see Deprecated Compiler Options for more information.
  • /clr 코드의 이중 썽킹이 줄어듭니다. 자세한 내용은 "이중 썽킹(C++)"을 참조하세요.Double thunking in /clr code is reduced; see Double Thunking (C++) for more information.
  • /EH(예외 처리 모델) 또는 /EHs는 throw 이외의 다른 방식으로 발생하는 예외를 catch하는 데 더 이상 사용할 수 없습니다. 대신 /EHa를 사용합니다./EH (Exception Handling Model) or /EHs can no longer be used to catch an exception that is raised with something other than a throw; use /EHa.
  • /errorReport(내부 컴파일러 오류 보고) 컴파일러 옵션이 추가되었습니다./errorReport (Report Internal Compiler Errors) compiler option has been added.
  • /favor(64에 대한 최적화) 컴파일러 옵션이 추가되었습니다./favor (Optimize for 64) compiler option has been added.
  • /FA, /Fa(목록 파일) 컴파일러 옵션이 추가되었습니다./FA, /Fa (Listing File) compiler option has been added.
  • /FC(진단의 소스 코드 파일에 대한 전체 경로) 컴파일러 옵션이 추가되었습니다./FC (Full Path of Source Code File in Diagnostics) compiler option has been added.
  • /fp(부동 소수점 동작 지정) 컴파일러 옵션이 추가되었습니다./fp (Specify Floating-Point Behavior) compiler option has been added.
  • /G(프로세서 최적화) 옵션 컴파일러 옵션이 추가되었습니다./G (Optimize for Processor) Options compiler option has been added.
  • /G(프로세서 최적화) 옵션 컴파일러 옵션이 추가되었습니다./G (Optimize for Processor) Options compiler option has been added.
  • /G3, /G4, /G5, /G6, /G7 및 /GB 컴파일러 옵션이 제거되었습니다./G3, /G4, /G5, /G6, /G7, and /GB compiler options have been removed. 컴파일러는 이제 모든 아키텍처에 대해 최상의 출력 파일을 만들려고 하는 "복합 모델"을 사용합니다.The compiler now uses a "blended model" that attempts to create the best output file for all architectures.
  • /Gf가 제거되었습니다./Gf has been removed. 대신 /GF(중복 문자열 제거)를 사용합니다.Use /GF (Eliminate Duplicate Strings) instead.
  • /GL(전체 프로그램 최적화)이 /CLRHEADER와 호환됩니다./GL (Whole Program Optimization) is now compatible with /CLRHEADER.
  • /GR은 기본적으로 사용됩니다./GR is now on by default.
  • /GS(버퍼 보안 검사)는 취약한 포인터 매개 변수에 대한 보안을 제공합니다./GS (Buffer Security Check) now provides security protection for vulnerable pointer parameters. /GS는 기본적으로 사용됩니다./GS is now on by default. /GS는 /clr(공용 언어 런타임 컴파일)을 사용하여 MSIL로 컴파일된 함수에서도 작동합니다./GS now also works on functions compiled to MSIL with /clr (Common Language Runtime Compilation).
  • /homeparams(스택에 레지스터 매개 변수 복사) 컴파일러 옵션이 추가되었습니다./homeparams (Copy Register Parameters to Stack) compiler option has been added.
  • /hotpatch(핫 패치 가능 이미지 만들기) 컴파일러 옵션이 추가되었습니다./hotpatch (Create Hotpatchable Image) compiler option has been added.
  • 인라인 함수 추론이 업데이트되었습니다. 자세한 내용은 inline, __inline, __forceinline 및 inline_depth를 참조하세요.Inline function heuristics have been updated; see inline, __inline, __forceinline and inline_depth for more information
  • 다양한 새 내장 함수가 추가되었으며, 이전에 문서화되지 않은 많은 내장 함수가 문서화되었습니다.Many new intrinsic functions have been added, and many previously undocumented intrinsics are now documented.
  • 실패한 new에 대한 호출은 기본적으로 예외를 throw합니다.By default, any call to new that fails will throw an exception.
  • /ML 및 /MLd 컴파일러 옵션이 제거되었습니다./ML and /MLd compiler options have been removed. Visual C++는 더 이상 단일 스레드, 정적으로 연결된 CRT 라이브러리 지원을 지원하지 않습니다.Visual C++ no longer supports single-threaded, statically linked CRT library support.
  • 컴파일러는 /O1, /O2(크기 최소화, 속도 최대화), /Og(전역 최적화) 및 /Ox(전체 최적화)를 사용하여 컴파일할 때 활성화되는 명명된 반환 값 최적화를 구현했습니다.The compiler implemented the Named Return Value Optimization, which is enabled when you compile with /O1, /O2 (Minimize Size, Maximize Speed), /Og (Global Optimizations), and /Ox (Full Optimization).
  • /Oa 컴파일러 옵션은 제거되었지만 자동으로 무시됩니다. noalias 또는 restrict__declspec 한정자를 사용하여 컴파일러에서 앨리어싱을 수행하는 방법을 지정합니다./Oa compiler option has been removed but will be silently ignored; use the noalias or restrict__declspec modifiers to specify how the compiler does aliasing.
  • /Op 컴파일러 옵션이 제거되었습니다./Op compiler option had been removed. 대신 /fp(부동 소수점 동작 지정)를 사용합니다.Use /fp (Specify Floating-Point Behavior) instead.
  • OpenMP가 Visual C++에서 지원됩니다.OpenMP is now supported by Visual C++.
  • /openmp(OpenMP 2.0 지원 활성화) 컴파일러 옵션이 추가되었습니다./openmp (Enable OpenMP 2.0 Support) compiler option has been added.
  • /Ow 컴파일러 옵션은 제거되었지만 자동으로 무시됩니다./Ow compiler option has been removed but will be silently ignored. noalias 또는 restrict__declspec 한정자를 사용하여 컴파일러에서 앨리어싱을 수행하는 방법을 지정합니다.Use the noalias or restrict__declspec modifiers to specify how the compiler does aliasing.

프로필 기반 최적화Profile-Guided Optimizations

  • /QI0f가 제거되었습니다./QI0f has been removed.
  • /QIfdiv가 제거되었습니다./QIfdiv has been removed.
  • /QIPF_B(B CPU 단계별 실행에 대한 Errata) 컴파일러 옵션이 추가되었습니다./QIPF_B (Errata for B CPU Stepping) compiler option has been added.
  • /QIPF_C(C CPU 단계별 실행에 대한 Errata) 컴파일러 옵션이 추가되었습니다./QIPF_C (Errata for C CPU Stepping) compiler option has been added.
  • /QIPF_fr32(상위 96개 부동 소수점 레지스터 사용 안 함) 컴파일러 옵션이 추가되었습니다./QIPF_fr32 (Do Not Use Upper 96 Floating Point Registers) compiler option has been added.
  • /QIPF_noPIC(위치 종속성 코드 생성) 컴파일러 옵션이 추가되었습니다./QIPF_noPIC (Generate Position Dependent Code) compiler option has been added.
  • /QIPF_restrict_plabels(런타임에 만든 함수가 없다고 가정) 컴파일러 옵션이 추가되었습니다./QIPF_restrict_plabels (Assume No Functions Created at Run Time) compiler option has been added.

컴파일러 및 링커에서의 유니코드 지원Unicode Support in the Compiler and Linker

  • /vd(생성 치환 비활성화)를 사용하면 생성되는 개체(/vd2)에서 dynamic_cast 연산자를 사용할 수 있습니다./vd (Disable Construction Displacements) now allows you to use dynamic_cast Operator on an object being constructed (/vd2)
  • /YX 컴파일러 옵션이 제거되었습니다./YX compiler option has been removed. 대신 /Yc(미리 컴파일된 헤더 파일 만들기) 또는 /Yu(미리 컴파일된 헤더 파일 사용)를 사용합니다.Use /Yc (Create Precompiled Header File) or /Yu (Use Precompiled Header File) instead. 빌드 구성에서 /YX를 제거하고 nothing으로 바꾸면 빌드가 빨라질 수 있습니다.If you remove /YX from your build configurations and replace it with nothing, it can result in faster builds.
  • /Zc: forScope는 기본적으로 사용됩니다./Zc:forScope is now on by default.
  • /Zc:wchar_t는 기본적으로 사용됩니다./Zc:wchar_t is now on by default.
  • /Zd 컴파일러 옵션이 제거되었습니다./Zd compiler option has been removed. 줄 번호만 표시 디버깅 정보는 더 이상 지원되지 않습니다.Line-number only debugging information is no longer supported. 대신 /Zi를 사용합니다. 자세한 내용은 /Z7, /Zi, /ZI(디버그 정보 형식)을 참조하세요.Use /Zi instead (see /Z7, /Zi, /ZI (Debug Information Format) for more information).
  • /Zg는 현재 C 소스 코드 파일에만 유효하며, C++ 소스 코드 파일에는 유효하지 않습니다./Zg is now only valid on C source code files, and not on C++ source code files.
  • /Zx(최적화된 Itanium 코드 디버그) 컴파일러 옵션이 추가되었습니다./Zx (Debug Optimized Itanium Code) compiler option has been added.

새 언어 기능New Language Features

  • attributeattribute는 더 이상 사용되지 않습니다.The attributeattribute is now deprecated.
  • appdomain__declspec 한정자가 추가되었습니다.appdomain__declspec modifier has been added.
  • __clrcall 호출 규칙이 추가되었습니다.__clrcall calling convention has been added.
  • 사용되지 않는 declspec(C++) 한정자를 사용하면, 사용자가 사용되지 않는 클래스 또는 함수에 액세스하려고 할 때 컴파일 시간에 표시되는 문자열을 지정할 수 있습니다.deprecated (C++)declspec modifier now allows you to specify a string that will be displayed at compile time, when a user tries to access a deprecated class or function.
  • dynamic_cast 연산자가 크게 변경되었습니다.dynamic_cast Operator has breaking changes.
  • 네이티브 열거형을 사용하면 기본 형식을 지정할 수 있습니다.Native enums now allow you to specify the underlying type.
  • jitintrinsicdeclspec 한정자가 추가되었습니다.jitintrinsicdeclspec modifier has been added.
  • noaliasdeclspec 한정자가 추가되었습니다.noaliasdeclspec modifier has been added.
  • process__declspec 한정자가 추가되었습니다.process__declspec modifier has been added.
  • abstract, override 및 sealed는 네이티브 컴파일에 유효합니다.abstract, override, and sealed are valid for native compilations.
  • __restrict 키워드가 추가되었습니다.__restrict keyword has been added.
  • restricttdeclspec 한정자가 추가되었습니다.restrictdeclspec modifier has been added.
  • __thiscall은 키워드입니다.__thiscall is now a keyword.
  • __unaligned 키워드가 문서화되었습니다.__unaligned keyword is now documented.
  • volatile(C++)은 최적화와 관련하여 동작을 업데이트했습니다.volatile (C++) has updated behavior with respect to optimizations.

새 전처리기 기능New Preprocessor Features

  • 미리 정의된 __CLR_VER 매크로가 추가되었습니다.__CLR_VER predefined macro added.
  • 주석(C/C++) pragma는 링커 주석으로 /MANIFESTDEPENDENCY를 적용합니다.The comment (C/C++) pragma now accepts /MANIFESTDEPENDENCY as a linker comment. 주석에 대한 exestr 옵션은 더 이상 사용되지 않습니다.The exestr option to comment is now deprecated.
  • embedded_idl 특성(#import 지시문)에서 선택적 매개 변수를 사용합니다.embedded_idl attribute (The #import Directive) now takes an optional parameter.
  • fenv_access pragmafenv_access pragma
  • float_control pragmafloat_control pragma
  • fp_contract pragmafp_contract pragma
  • pragma unmanaged, pragma unmanaged 및 unmanaged 섹션에 전역 변수가 있는 경우 전역 변수가 선언된 순서대로 초기화되지 않습니다.Global variables will not be initialized in the order they are declared if you have global variables in pragma managed, unmanaged and unmanaged sections. 예를 들어 unmanaged 전역 변수가 managed 전역 변수로 초기화되고 완전히 생성된 관리되는 개체가 필요한 경우 이는 잠재적인 주요 변경 내용입니다.This is a potential breaking change if, for example, an unmanaged global variable is initialized with a managed global variables, and a fully constructed managed object is required.
  • init_seg로 지정된 섹션은 이제 읽기 전용이므로 이전 버전과 같이 읽기/쓰기가 아닙니다.Sections specified with init_seg are now read only, and not read/write as in previous versions.
  • inline_depth의 기본값은 16입니다.inline_depth default is now 16. Visual C++ .NET 2003에서도 기본값인 16이 적용되었습니다.A default of 16 was also in effect in Visual C++ .NET 2003.
  • 미리 정의된 _INTEGRAL_MAX_BITS 매크로가 추가되었습니다. "미리 정의된 매크로"를 참조하세요._INTEGRAL_MAX_BITS predefined macro added, see Predefined Macros.
  • 미리 정의된 _M_CEE, _M_CEE_PURE 및 _M_CEE_SAFE 매크로가 추가되었습니다. "미리 정의된 매크로"를 참조하세요._M_CEE, _M_CEE_PURE, and _M_CEE_SAFE predefined macros added, see Predefined Macros.
  • 미리 정의된 _M_IX86_FP 매크로가 추가되었습니다._M_IX86_FP predefined macro added.
  • 미리 정의된 _M_X64 매크로가 추가되었습니다._M_X64 predefined macro added.
  • make_public pragmamake_public pragma
  • 관리되거나(managed) 관리되지 않는(unmanaged) pragma 구문이 업데이트되었습니다(현재 푸시 및 팝이 있음).managed, unmanaged pragma syntax updated (now has push and pop)
  • mscorlib.dll은 모든 /clr 컴파일의 #using 지시문에서 암시적으로 참조됩니다.mscorlib.dll is now implicitly referenced by The #using Directive in all /clr compilations.
  • 미리 정의된 _OPENMP매크로가 추가되었습니다._OPENMP predefined macro added.
  • optimize pragma가 업데이트되었고, a 및 w는 더 이상 유효한 매개 변수가 아닙니다.optimize pragma has been updated, a and w are no longer valid parameters.
  • no_registry#import 특성이 추가되었습니다.no_registry#import attribute has been added.
  • region, endregion pragmas가 추가되었습니다.region, endregion pragmas added
  • 미리 정의된 _VC_NODEFAULTLIB 매크로가 추가되었습니다._VC_NODEFAULTLIB predefined macro added.
  • variadic 매크로가 구현되었습니다.Variadic Macros are now implemented.
  • vtordisp는 더 이상 사용되지 않으며, 이후 Visual C++ 릴리스에서 제거됩니다.vtordisp is deprecated and will be removed in a future release of Visual C++.
  • warning pragma에는 이제 표시 안 함 지정자가 있습니다.The warning pragma now has the suppress specifier.

새 링커 기능New Linker Features

  • 모듈(비어셈블리 MSIL 출력 파일)은 링커에 대한 입력으로 허용됩니다.Modules (non-assembly MSIL output files) are now allowed as input to the linker.
  • /ALLOWISOLATION(매니페스트 조회) 링커 옵션이 추가되었습니다./ALLOWISOLATION (Manifest Lookup) linker option has been added.
  • /ASSEMBLYRESOURCE(관리되는 리소스 포함)가 업데이트되어 어셈블리에서 리소스 이름을 지정하고 리소스가 어셈블리에서 private가 되도록 지정할 수 있습니다./ASSEMBLYRESOURCE (Embed a Managed Resource) has been updated to now allow you to specify the name of the resource in the assembly, and to specify that the resource is private in the assembly.
  • /CLRIMAGETYPE(CLR 이미지 형식 지정) 링커 옵션이 추가되었습니다./CLRIMAGETYPE (Specify Type of CLR Image) linker option has been added.
  • /CLRSUPPORTLASTERROR(PInvoke 호출의 마지막 오류 코드 유지) 링커 옵션이 추가되었습니다./CLRSUPPORTLASTERROR (Preserve Last Error Code for PInvoke Calls) linker option has been added.
  • /CLRTHREADATTRIBUTE(CLR 스레드 특성 설정) 링커 옵션이 추가되었습니다./CLRTHREADATTRIBUTE (Set CLR Thread Attribute) linker option has been added.
  • /CLRUNMANAGEDCODECHECK(SupressUnmanagedCodeSecurityAttribute 추가) 링커 옵션이 추가되었습니다./CLRUNMANAGEDCODECHECK (Add SupressUnmanagedCodeSecurityAttribute) linker option has been added.
  • /ERRORREPORT(내부 링커 오류 보고) 링커 옵션이 추가되었습니다./ERRORREPORT (Report Internal Linker Errors) linker option has been added.
  • /EXETYPE 링커 옵션이 제거되었습니다./EXETYPE linker option has been removed. 링커는 더 이상 Windows 95 및 Windows 98 장치 드라이버를 만들도록 지원하지 않습니다.The linker no longer supports creating Windows 95 and Windows 98 device drivers. 적절한 DDK를 사용하여 이러한 장치 드라이버를 만듭니다.Use an appropriate DDK to create these device drivers. EXETYPE 키워드는 더 이상 모듈 정의 파일에 유효하지 않습니다.The EXETYPE keyword is no longer valid for module definition files.
  • /FUNCTIONPADMIN(핫 패치 가능 이미지 만들기) 링커 옵션이 추가되었습니다./FUNCTIONPADMIN (Create Hotpatchable Image) linker option has been added.
  • /LTCG 링커 옵션이 /clr을 사용하여 컴파일된 모듈에서 지원됩니다./LTCG linker option is now supported on modules compiled with /clr. /LTCG는 프로필 기반 최적화를 지원하도록 업데이트되었습니다./LTCG has also been updated to support profile-guided optimizations.
  • /MANIFEST(Side-by-Side 어셈블리 매니페스트 만들기) 링커 옵션이 추가되었습니다./MANIFEST (Create Side-by-Side Assembly Manifest) linker option has been added.
  • /MANIFESTDEPENDENCY(매니페스트 종속성 지정) 링커 옵션이 추가되었습니다./MANIFESTDEPENDENCY (Specify Manifest Dependencies) linker option has been added.
  • /MANIFESTFILE(매니페스트 파일 이름 지정) 링커 옵션이 추가되었습니다./MANIFESTFILE (Name Manifest File) linker option has been added.
  • /MAPINFO: LINES 링커 옵션이 제거되었습니다./MAPINFO:LINES linker option has been removed.
  • /NXCOMPAT(데이터 실행 방지와 호환) 링커 옵션이 추가되었습니다./NXCOMPAT (Compatible with Data Execution Prevention) linker option has been added.
  • /PGD(프로필 기반 최적화를 위한 데이터베이스 지정) 링커 옵션이 추가되었습니다./PGD (Specify Database for Profile-Guided Optimizations) linker option has been added.
  • /PROFILE(성능 도구 프로파일러) 링커 옵션이 추가되었습니다./PROFILE (Performance Tools Profiler) linker option has been added.
  • /SECTION(섹션 특성 지정) 링커 옵션이 특성 부정을 지원하며, 더 이상 L 또는 D(VxD 관련) 특성을 지원하지 않습니다./SECTION (Specify Section Attributes) linker option now supports attribute negation and no longer supports the L or D (VxD-related) attributes.
  • 컴파일러 및 링커에서의 유니코드 지원Unicode Support in the Compiler and Linker
  • /VERBOSE(출력 진행 메시지) 링커 옵션은 이제 ICF 및 REF도 허용합니다./VERBOSE (Print Progress Messages) linker option now also accepts ICF and REF.
  • /VXD 링커 옵션이 제거되었습니다./VXD linker option has been removed. 링커는 더 이상 Windows 95 및 Windows 98 장치 드라이버를 만들도록 지원하지 않습니다.The linker no longer supports creating Windows 95 and Windows 98 device drivers. 적절한 DDK를 사용하여 이러한 장치 드라이버를 만듭니다.Use an appropriate DDK to create these device drivers. VXD 키워드는 더 이상 모듈 정의 파일에 유효하지 않습니다.The VXD keyword is no longer valid for module definition files.
  • /WS 링커 옵션이 제거되었습니다./WS linker option has been removed. /WS는 Windows NT 4.0에 대한 대상 이미지를 수정하는 데 사용되었습니다./WS was used to modify images targeted for Windows NT 4.0. IMAGECFG.exe -R filename을 /WS 대신 사용할 수 있습니다.IMAGECFG.exe -R filename can be used instead of /WS. IMAGECFG.exe는 Windows NT 4.0 CD-ROM의 SUPPORT\DEBUG\I386\IMAGECFG.EXE에 있습니다.IMAGECFG.exe can be found on the Windows NT 4.0 CD-ROM in SUPPORT\DEBUG\I386\IMAGECFG.EXE.
  • /WX(링커 경고를 오류로 처리) 링커 옵션이 문서화되었습니다./WX (Treat Linker Warnings as Errors) linker option is now documented.

새 링커 유틸리티 기능New Linker Utility Features

  • /ALLOWISOLATION editbin 옵션이 추가되었습니다./ALLOWISOLATION editbin option had been added
  • DESCRIPTION 모듈 정의 파일 문이 제거되었습니다.DESCRIPTION module definition file statement is removed. 링커는 더 이상 가상 장치 드라이버를 작성하도록 지원하지 않습니다.The linker no longer supports building virtual device drivers.
  • /ERRORREPORT 옵션이 bscmake.exe, dumpbin.exe, editbin.exe 및 lib.exe에 추가되었습니다./ERRORREPORT option has been added to bscmake.exe, dumpbin.exe, editbin.exe, and lib.exe.
  • /LTCG lib 옵션이 추가되었습니다./LTCG lib option has been added.
  • /NXCOMPAT editbin 옵션이 추가되었습니다./NXCOMPAT editbin option has been added.
  • /RANGE dumpbin 옵션이 추가되었습니다./RANGE dumpbin option has been added.
  • /TLS dumpbin 옵션이 추가되었습니다./TLS dumpbin option has been added.
  • /WS editbin 옵션이 제거되었습니다./WS editbin option has been removed. /WS는 Windows NT 4.0에 대한 대상 이미지를 수정하는 데 사용되었습니다./WS was used to modify images targeted for Windows NT 4.0. IMAGECFG.exe -R filename을 /WS 대신 사용할 수 있습니다.IMAGECFG.exe -R filename can be used instead of /WS. IMAGECFG.exe는 Windows NT 4.0 CD-ROM의 SUPPORT\DEBUG\I386\IMAGECFG.EXE에 있습니다.IMAGECFG.exe can be found on the Windows NT 4.0 CD-ROM in SUPPORT\DEBUG\I386\IMAGECFG.EXE.
  • /WX[:NO] lib 옵션이 추가되었습니다./WX[:NO] lib option has been added.

새 NMAKE 기능New NMAKE Features

  • /ERRORREPORT가 추가되었습니다./ERRORREPORT has been added.
  • /G가 추가되었습니다./G has been added.
  • 미리 정의된 규칙이 업데이트되었습니다.The predefined rules have been updated.
  • 재귀 매크로에 문서화된 $(MAKE) 매크로는 nmake.exe에 대한 전체 경로를 제공합니다.The $(MAKE) macro, which is documented in Recursion Macros, now gives the full path to nmake.exe.

새 MASM 기능New MASM Features

  • MASM 식은 64비트 값입니다.MASM expressions are now 64-bit values. 이전 버전에서 MASM 식은 32비트 값이었습니다.In previous versions MASM expressions were 32-bit values.
  • __asm int 3 명령은 함수를 네이티브로 컴파일하도록 합니다.The instruction __asm int 3 now causes a function to be compiled to native.
  • ALIAS(MASM)가 문서화되었습니다.ALIAS (MASM) is now documented.
  • /ERRORREPORT ml.exe 및 ml64.exe 옵션이 추가되었습니다./ERRORREPORT ml.exe and ml64.exe option is added.
  • .FPO가 문서화되었습니다..FPO is now documented.
  • H2INC.exe는 Visual C++ 2005에서 제공되지 않습니다.H2INC.exe will not ship in Visual C++ 2005. H2INC를 계속 사용해야 하는 경우 이전 버전의 Visual C++에서 H2INC.exe를 사용합니다.If you need to continue to use H2INC, use H2INC.exe from a previous version of Visual C++.
  • IMAGEREL 연산자가 추가되었습니다.operator IMAGEREL has been added.
  • HIGH32 연산자가 추가되었습니다.operator HIGH32 has been added.
  • LOW32 연산자가 추가되었습니다.operator LOW32 has been added.
  • ml64.exe는 x64 아키텍처용 MASM 버전입니다.ml64.exe is a version of MASM for the x64 architecture. x64 .asm 파일을 x64 개체 파일로 어셈블합니다.It assembles x64 .asm files into x64 object files. 인라인 어셈블리 언어는 x64 컴파일러에서 지원되지 않습니다.Inline assembly language is not supported in the x64 compiler. ml64.exe(x64)에 대해 추가된 MASM 지시문은 다음과 같습니다.The following MASM directives have been added for ml64.exe (x64):
  • .ALLOCSTACK.ALLOCSTACK
  • .ENDPROLOG.ENDPROLOG
  • .PUSHFRAME.PUSHFRAME
  • .PUSHREG.PUSHREG
  • .SAVEREG.SAVEREG
  • .SAVEXMM128.SAVEXMM128
  • .SETFRAME. 또한 PROC 지시문은 x64 전용 구문으로 업데이트되었습니다..SETFRAME In addition, the PROC directive was updated with x64-only syntax.
  • MMWORD 지시문이 추가되었습니다.MMWORD directive has been added
  • /omf(ML.exe 명령줄 옵션)는 /c를 의미합니다./omf (ML.exe command line option) now implies /c. ML.exe는 OMF 형식 개체 연결을 지원하지 않습니다.ML.exe does not support linking OMF format objects.
  • SEGMENT 지시문이 추가 특성을 지원합니다.The SEGMENT directive now supports additional attributes.
  • SECTIONREL 연산자가 추가되었습니다.operator SECTIONREL has been added.
  • XMMWORD 지시문이 추가되었습니다.XMMWORD directive has been added

새 CRT 기능New CRT Features

  • 여러 함수의 보안 버전이 추가되었습니다.Secure versions of several functions have been added. 이러한 함수는 오류를 더 효율적인 방식으로 처리하고, 버퍼에 더 강력한 제어를 적용하여 일반적인 보안 결함을 방지합니다.These functions handle errors in a better way and enforce stricter controls on buffers to help avoid common security flaws. 새로운 보안 버전은 _s 접미사로 식별됩니다.The new secure versions are identified by the _s suffix.
  • 기존의 보안 수준이 낮은 버전의 많은 함수가 더 이상 사용되지 않습니다.Existing less secure versions of many functions have been deprecated. 사용 중단 경고를 사용하지 않으려면 _CRT_SECURE_NO_WARNINGS를 정의합니다.To disable the deprecation warnings, define _CRT_SECURE_NO_WARNINGS.
  • 기존의 많은 함수에서 매개 변수의 유효성을 검사하고, 잘못된 매개 변수가 전달되면 잘못된 매개 변수 처리기를 호출합니다.Many existing functions now validate their parameters and invoke the invalid parameter handler when an invalid parameter is passed.
  • 기존의 많은 함수에서 이전에 설정하지 않았던 errno를 설정합니다.Many existing functions now set errno where they did not before.
  • 정수 형식의 typedef errno_t가 추가되었습니다.The typedef errno_t with type integer was added. errno_t가 함수 반환 형식 또는 매개 변수에서 errno의 오류 코드를 처리할 때마다 사용됩니다.errno_t is used whenever a function return type or parameter deals with error codes from errno. errno_t는 errcode를 대체합니다.errno_t replaces errcode.
  • 로캘 종속 함수에는 현재 로캘을 사용하는 대신 로캘을 매개 변수로 사용하는 버전이 있습니다.Locale-dependent functions now have versions which take the locale as a parameter rather than using the current locale. 이러한 새 함수에는 _l 접미사가 있습니다.These new functions have the _l suffix. 로캘 개체를 사용하기 위해 몇 가지 새로운 함수가 추가되었습니다.Several new functions were added to work with locale objects. 새 함수에는 _get_current_locale, _create_locale 및 _free_locale이 포함됩니다.New functions include _get_current_locale, _create_locale and _free_locale.
  • 파일 핸들 잠금 및 잠금 해제를 지원하는 새 함수가 추가되었습니다.New functions were added to support locking and unlocking file handles.
  • 함수의 _spawn 계열은 이전 버전과 같이 성공 시 errno를 0으로 다시 설정하지 않습니다.The _spawn family of functions does not reset errno to zero on success, as it did in previous versions.
  • 인수가 사용되는 순서를 지정할 수 있는 printf 계열의 함수 버전을 사용할 수 있습니다.Versions of the printf family of functions that allow you to specify the order in which the arguments are used are available.
  • 유니코드 텍스트 형식이 지원됩니다.Unicode is now a supported text format. _open 함수는 _O_TEXTW, _O_UTF8 및 _O_UTF16 특성을 지원합니다.The function _open supports _O_TEXTW, _O_UTF8 and _O_UTF16 attributes. fopen 함수는 유니코드 형식을 지정하는 "ccs=ENCODING" 메서드를 지원합니다.The fopen function supports the "ccs=ENCODING" method of specifying a Unicode format.
  • 관리 코드(MSIL)로 빌드된 CRT 라이브러리의 새 버전을 사용할 수 있으며, /clr(공용 언어 런타임 컴파일) 옵션을 사용하여 컴파일할 때 사용됩니다.A new version of the CRT libraries built in managed code (MSIL) is now available and is used when compiling with the /clr (Common Language Runtime Compilation) option.
  • _fileinfo가 제거되었습니다._fileinfo has been removed.
  • time_t의 기본 크기는 64비트입니다. 이에 따라 time_t 및 몇 가지 시간 함수의 범위가 3000년까지 확장됩니다.The default size for time_t is now 64 bits, which expands the range of time_t and several of the time functions out to the year 3000.
  • CRT는 스레드 단위의 로캘 설정을 지원합니다.The CRT now supports setting the locale on a per thread basis. 이 기능을 지원하기 위해 _configthreadlocale 함수가 추가되었습니다.The function _configthreadlocale was added to support this feature.
  • x87 및 SSE2 부동 소수점 프로세서 모두에서 부동 소수점 제어 단어를 액세스하고 제어할 수 있도록 _statusfp2 및 __control87_2 함수가 추가되었습니다.The _statusfp2 and __control87_2 functions were added to allow access to and control of the floating point control word on both the x87 and SSE2 floating point processor.
  • 시간(struct tm)을 GMT(그리니치 표준시)로 변환하는 기능을 지원하기 위해 _mkgmtime 및 _mkgmtime64 함수가 추가되었습니다.The_mkgmtime and _mkgmtime64 functions were added to provide support for converting times (struct tm) to Greenwich Mean Time (GMT).
  • swprintf 및 vswprintf가 표준을 더 잘 준수하도록 변경되었습니다.Changes were made to swprintf and vswprintf to better conform with the standard.
  • 새로운 INTRIN.H 헤더 파일에서 일부 내장 함수에 대한 프로토타입을 제공합니다.A new header file, INTRIN.H, provides prototypes for some intrinsic functions.
  • fopen 함수에 N 특성이 있습니다.The fopen function now has an N attribute.
  • _open 함수에 _O_NOINHERIT 특성이 있습니다.The _open function now has an _O_NOINHERIT attribute.
  • atoi 함수는 INT_MAX를 반환하고, 오버플로가 발생하면 errno를 ERANGE로 설정합니다.The atoi function now returns INT_MAX and sets errno to ERANGE on overflow. 이전 버전에서는 오버플로 동작이 정의되지 않았습니다.In previous versions, the overflow behavior was undefined.
  • printf 계열의 함수는 %a 및 %A 형식 지정자를 사용하여 ANSI C99 표준에 따라 구현된 16진수 부동 소수점 출력을 지원합니다.The printf family of functions supports hexadecimal floating point output implemented according to the ANSI C99 standard using the format type specifiers %a and %A.
  • printf 계열은 "ll"(long long) 크기 접두사를 지원합니다.The printf family now supports the "ll" (long long) size prefix.
  • _controlfp 함수가 더 나은 성능을 위해 최적화되었습니다.The _controlfp function has been optimized for better performance.
  • 일부 함수의 디버그 버전이 추가되었습니다.Debug versions of some functions have been added.
  • _chgsignl 및 _cpysignl(long double 버전)이 추가되었습니다.Added _chgsignl and _cpysignl (long double versions).
  • _locale_t 형식이 형식 테이블에 추가되었습니다.Added _locale_t type to type table.
  • 새 _countof Macro 매크로가 _countof 배열의 요소 수를 계산하기 위해 추가되었습니다.New macro _countof Macro added for computing number of elements in an array.
  • 각 함수 항목에서 .NET Framework에 해당하는 섹션이 추가되었습니다.In each function topic, a section on .NET Framework equivalents has been added.
  • 몇 가지 문자열 함수에는 출력 버퍼가 너무 작을 때 실패하지 않고 문자열을 자르는 옵션이 있습니다. _TRUNCATE를 참조하세요.Several string functions now have the option of truncating strings rather than failing when output buffers are too small; see _TRUNCATE.
  • _set_se_translator를 사용하려면 /EHa 컴파일러 옵션을 사용해야 합니다._set_se_translator now requires the use of the /EHa compiler option.
  • fpos_t는 /Za(C 코드의 경우) 및 STDC__가 수동으로 설정된 경우(C++ 코드의 경우)에서 __int64입니다.fpos_t is now __int64 under /Za (for C code) and when __STDC is set manually (for C++ code). 구조체가 되도록 하는 데 사용했습니다.It used to be a struct.
  • _CRT_DISABLE_PERFCRIT_LOCKS는 단일 스레드 프로그램의 I/O 성능을 향상시킬 수 있습니다._CRT_DISABLE_PERFCRIT_LOCKS can improve the I/O performance of single-threaded programs.
  • POSIX 이름은 ISO C++ 호환 이름을 따르므로 더 이상 사용되지 않습니다(예: getch 대신 _getch 사용).POSIX names have been deprecated in favor of ISO C++ conformant names (for example, use _getch rather than getch).
  • 새 링크 옵션인 .obj 파일은 pure 모드에서 사용할 수 있습니다.New link options .obj files are available for pure mode
  • _recalloc은 realloc과 calloc의 기능을 결합합니다._recalloc combines features of realloc and calloc.

Visual Studio 2003의 새로운 C++ 기능What's New for C++ in Visual Studio 2003

컴파일러Compiler

  • 이전 버전의 런타임에서 현재 버전의 컴파일러를 사용하여 빌드된 Managed Extensions for C++ 응용 프로그램을 실행하는 방법에 대한 정보.Information on how to run a Managed Extensions for C++ application built with the current version's compiler on a previous version of the runtime.
  • Managed Extensions for C++에 대한 FAQ(질문과 대답)Managed Extensions for C++ Frequently Asked Questions.
  • Managed Extensions for C++를 사용하도록 기존 네이티브 응용 프로그램을 이식하는 방법을 보여 주는 연습(연습: .NET Framework 구성 요소와 상호 운용하도록 기존 네이티브 C++ 응용 프로그램 이식)이 추가되었습니다.A walkthrough has been added showing how to port an existing, native application to use Managed Extensions for C++: Walkthrough: Porting an Existing Native C++ Application to Interoperate with .NET Framework Components.
  • 값 형식의 메서드에 대리자를 만들 수 있습니다.You can now create a delegate on a method of a value type.
  • Visual C++ .NET 2003에 대한 컴파일러의 C++ 표준 준수가 크게 향상되었습니다.The compiler's conformance with the C++ standard has been significantly enhanced for Visual C++ .NET 2003.
  • /arch 컴파일러 옵션이 추가되었습니다./arch compiler option is added.
  • /Gf는 더 이상 사용되지 않으며, 다음 버전의 Visual C++에서 제거됩니다./Gf is deprecated and will be removed in the next version of Visual C++.
  • /G7 컴파일러 옵션이 추가되었습니다./G7 compiler option is added.
  • /GS 컴파일러 옵션이 직접 버퍼 오버런으로부터 로컬 변수를 보호하도록 향상되었습니다.The /GS compiler option has been enhanced to help protect local variables from direct buffer overruns.
  • /noBool 컴파일러 옵션이 제거되었습니다.The /noBool compiler option has been removed. 컴파일러는 C++ 소스 코드 파일에서 bool을 키워드(식별자가 아님)로만 표시하도록 할 수 있습니다.The compiler now allows bool to appear only as a keyword (and not an identifier) in a C++ source code file.
  • long long 형식은 __int64의 typedef로 사용할 수 있습니다. CRT에서는 아직 long long을 지원하지 않습니다.The long long type is now available as a typedef of __int64 Note that there is not yet support for long long in the CRT.
  • /Zm 컴파일러 옵션은 미리 컴파일된 헤더 메모리의 할당 제한을 지정합니다.The /Zm compiler option now specifies the precompiled header memory allocation limit.
  • _InterlockedCompareExchange 내장 함수가 문서화되었습니다._InterlockedCompareExchange intrinsic now documented.
  • _InterlockedDecrement 내장 함수가 문서화되었습니다._InterlockedDecrement intrinsic now documented.
  • _InterlockedExchange 내장 함수가 문서화되었습니다._InterlockedExchange intrinsic now documented.
  • _InterlockedExchangeAdd 내장 함수가 문서화되었습니다._InterlockedExchangeAdd intrinsic now documented.
  • _InterlockedIncrement 내장 함수가 문서화되었습니다._InterlockedIncrement intrinsic now documented.
  • _ReadWriteBarrier 내장 함수가 추가되었습니다._ReadWriteBarrier intrinsic added.

특성Attributes

  • implements 특성이 문서화되었습니다.implements attribute is now documented.

링커 기능Linker features

추가된 링커 스위치는 다음과 같습니다.The following linker switches have been added:

  • /ASSEMBLYDEBUG/ASSEMBLYDEBUG
  • /ASSEMBLYLINKRESOURCE/ASSEMBLYLINKRESOURCE
  • DELAYSIGNDELAYSIGN
  • /KEYFILE/KEYFILE
  • /KEYCONTAINER/KEYCONTAINER
  • /SAFESEH/SAFESEH

MASMMASM

.SAFESEH 지시문 및 /safeseh ml.exe 옵션이 추가되었습니다.The .SAFESEH directive and /safeseh ml.exe option were added.

참고 항목See Also

Visual C++ 포팅 및 업그레이드 가이드Visual C++ Porting and Upgrading Guide