Änderungsverlauf von Visual C++ von 2003 bis 2015Visual C++ change history 2003 - 2015

In diesem Artikel werden alle bedeutenden Änderungen von Visual Studio 2015 zurück bis Visual Studio 2003 beschrieben. Die in diesem Artikel verwendeten Begriffe „neues Verhalten“ und „jetzt“ beziehen sich auf Visual Studio 2015 und höher.This article describes all the breaking changes from Visual Studio 2015 going back to Visual Studio 2003, and in this article the terms "new behavior" or "now" refer to Visual Studio 2015 and later. Die Begriffe „altes Verhalten“ und „davor“ beziehen sich auf Visual Studio 2013 und frühere Versionen.The terms "old behavior" and "before" refer to Visual Studio 2013 and earlier releases.

Informationen zur neuesten Version von Visual Studio finden Sie unter What's new for Visual C++ in Visual Studio (Neuerungen bei Visual C++ in Visual Studio) und Conformance Improvements in Visual C++ in Visual Studio (Verbesserungen bei der Übereinstimmung mit Visual C++-Standards in Visual Studio).For information about the latest version of Visual Studio, see What's new for Visual C++ in Visual Studio and Conformance Improvements in Visual C++ in Visual Studio.

Hinweis

Es gibt keine binären Änderungen von Visual Studio 2015 auf Visual Studio 2017.There are no binary breaking changes between Visual Studio 2015 and Visual Studio 2017.

Wenn Sie auf eine neue Version von Visual Studio upgraden, treten unter Umständen Kompilierungs- und/oder Laufzeitfehler im Code auf, der zuvor ordnungsgemäß kompiliert und ausgeführt wurde.When you upgrade to a new version of Visual Studio, you might encounter compilation and/or runtime errors in code that previously compiled and ran correctly. Änderungen in der neuen Version, die solche Probleme verursachen, werden als bedeutende Änderungen bezeichnet und werden in der Regel durch Änderungen im C++-Sprachenstandard, in den Funktionssignaturen oder im Layout von Objekten im Arbeitsspeicher erforderlich.Changes in the new version that cause such problems are known as breaking changes, and typically they're required by modifications in the C++ language standard, function signatures, or the layout of objects in memory.

Es wird empfohlen, dass Sie keine statischen Links zu Binärdateien mit einer anderen Version des Compilers erstellen, um Laufzeitfehler zu vermeiden, die schwer zu erkennen und zu diagnostizieren sind.To avoid run-time errors that are difficult to detect and diagnose, we recommend that you never statically link to binaries compiled by using a different version of the compiler. Stellen Sie beim Aktualisieren eines EXE- oder DLL-Projekts außerdem sicher, die Bibliotheken zu aktualisieren, mit denen es verknüpft ist.Also, when you upgrade an EXE or DLL project, make sure to upgrade the libraries that it links to. Übergeben Sie keine CRT- (C-Laufzeit) oder C++-Standardbibliothekstypen zwischen Binärdateien, einschließlich DLL-Dateien, die mit verschiedenen Versionen des Compilers kompiliert wurden.Don't pass CRT (C Runtime) or C++ Standard Library (C++ Standard Library) types between binaries, including DLLs, compiled by using different versions of the compiler. Weitere Informationen finden Sie unter Potenzielle Fehler bei der Übergabe von CRT-Objekten über DLL-Grenzen.For more information, see Potential Errors Passing CRT Objects Across DLL Boundaries.

Sie sollten außerdem nie Code schreiben, der von einem bestimmten Layout für ein Objekt abhängt, das weder eine COM-Schnittstelle noch ein POD-Objekt ist.You should never write code that depends on a particular layout for an object that isn't a COM interface or a POD object. Wenn Sie diesen Code schreiben, müssen Sie sicherstellen, dass er nach dem Upgrade funktioniert.If you do write such code, then you must ensure that it works after you upgrade. Weitere Informationen finden Sie unter Portabilität an ABI-Grenzen.For more information, see Portability At ABI Boundaries.

Darüber hinaus können fortlaufende Verbesserungen der Übereinstimmung des Compilers mit Standards mitunter ändern, wie der Compiler den vorhandenen Quellcode versteht.Additionally, ongoing improvements to compiler conformance can sometimes change how the compiler understands your existing source code. Beispielsweise können während des Buildvorgangs neue oder andere Fehler oder sogar Verhaltensunterschiede im Code auftreten, für den zuvor Builds erstellt wurden und die Ausführung ordnungsgemäß schien.For example, you might find new or different errors during your build, or even behavioral differences in code that previously built and seemed to run correctly. Obwohl diese Verbesserungen keine Breaking Changes wie die in diesem Artikel genannten Änderungen sind, müssen Sie möglicherweise einige Änderungen an Ihrem Quellcode vornehmen, um diese Probleme zu beheben:Although these improvements aren't breaking changes like the ones discussed in this document, you may need to make changes to your source code to resolve these issues:

Visual Studio 2015: Änderungen bei der Konformität mit StandardsVisual Studio 2015 Conformance Changes

C-Lauf Zeit Bibliothek (CRT)C Runtime Library (CRT)

Allgemeine ÄnderungenGeneral Changes

  • Umgestaltete BinärdateienRefactored binaries

    Die CRT-Bibliothek wurde in zwei verschiedene Binärdateien umgestaltet: eine Universal CRT (ucrtbase), die den Großteil der Standardfunkionen enthält, und eine VC-Laufzeitbibliothek (vcruntime).The CRT Library has been refactored into a two different binaries: a Universal CRT (ucrtbase), which contains most of the standard functionality, and a VC Runtime Library (vcruntime). Die VC-Laufzeitbibliothek enthält die compilergebundenen Funktionen wie die Ausnahmebehandlung und intrinsische Funktionen.The vcruntime library contains the compiler-related functionality such as exception handling, and intrinsics. Wenn Sie die standardmäßigen Projekteinstellungen verwenden, sind Sie von dieser Änderung nicht betroffen, da der Linker automatisch die neuen Standardbibliotheken verwendet.If you are using the default project settings, then this change doesn't impact you since the linker will use the new default libraries automatically. Wenn Sie die Linker-Eigenschaft Alle Standardbibliotheken ignorieren des Projekts auf Ja festgelegt haben oder die /NODEFAULTLIB-Linkeroption in der Befehlszeile verwenden, müssen Sie die Liste der Bibliotheken (bei der Eigenschaft Zusätzliche Abhängigkeiten) so aktualisieren, dass sie die neuen umgestalteten Bibliotheken enthält.If you've set the project's Linker property Ignore All Default Libraries to Yes or you are using the /NODEFAULTLIB linker option on the command line, then you must update your list of libraries (in the Additional Dependencies property) to include the new, refactored libraries. Ersetzen Sie die alte CRT-Bibliothek (libcmt.lib, libcmtd.lib, msvcrt.lib, msvcrtd.lib) mit den entsprechenden umgestalteten Bibliotheken.Replace the old CRT library (libcmt.lib, libcmtd.lib, msvcrt.lib, msvcrtd.lib) with the equivalent refactored libraries. Für jede der beiden umgestalteten Bibliotheken gibt es eine statische (.lib) und eine dynamische (.dll) Version sowie endgültige (ohne Suffix) und Debugversionen (mit dem Suffix „d“).For each of the two refactored libraries, there are static (.lib) and dynamic (.dll) versions, and release (with no suffix) and debug versions (with the "d" suffix). Die dynamischen Versionen haben eine Importbibliothek, mit der eine Verknüpfung erstellt wird.The dynamic versions have an import library that you link with. Die zwei umgestalteten Bibliotheken sind Universal CRT, d. h. „ucrtbase.dll“ oder „ucrtbase.lib“, „ucrtbased.dll“ oder „ucrtbased.lib“, und die VC-Laufzeitbibliothek, „libvcruntime.lib“, die „vcruntimeVersion.dll“, „libvcruntimed.lib“ und „vcruntimedVersion.dll“.The two refactored libraries are Universal CRT, specifically ucrtbase.dll or ucrtbase.lib, ucrtbased.dll or ucrtbased.lib, and the VC runtime library, libvcruntime.lib, vcruntimeversion.dll, libvcruntimed.lib, and vcruntimedversion.dll. Die Version sowohl in Visual Studio 2015 als auch in Visual Studio 2017 ist 140.The version in both Visual Studio 2015 and Visual Studio 2017 is 140. Siehe CRT-Bibliotheksfunktionen.See CRT Library Features.

<locale.h>

  • localeconvlocaleconv

    Die in „locale.h“ deklarierte localeconv-Funktion funktioniert nun ordnungsgemäß, wenn threadspezifisches Gebietsschema aktiviert ist.The localeconv function declared in locale.h now works correctly when per-thread locale is enabled. In früheren Versionen der Bibliothek hat diese Funktion die lconv-Daten für das globale Gebietsschema zurückgegeben statt den für das Gebietsschema des Threads.In previous versions of the library, this function would return the lconv data for the global locale, not the thread's locale.

    Wenn Sie threadspezifische Gebietsschemas verwenden, sollten Sie Ihre Nutzung von localeconv überprüfen.If you use per-thread locales, you should check your use of localeconv. Wenn Ihr Code davon ausgeht, dass die lconv-Daten für das globale Gebietsschema zurückgegeben werden, sollten Sie dies korrigieren.If your code assumes that the lconv data returned is for the global locale, you should correct it.

<math.h>

  • C++-Überladungen der math-BibliotheksfunktionenC++ overloads of math library functions

    In früheren Versionen wurden <math.h> einige, jedoch nicht alle C++-über Ladungen für die Funktionen der mathematischen Bibliothek definiert.In previous versions, <math.h> defined some, but not all, of the C++ overloads for the math library functions. Die restlichen über Ladungen waren in der <cmath> Kopfzeile.The rest of the overloads were in the <cmath> header. Code, der nur enthalten ist, <math.h> kann Probleme mit der Auflösung von Funktions Überladungen haben.Code that only included <math.h> could have problems with function overload resolution. Die C++-über Ladungen wurden nun aus entfernt <math.h> und werden nur in gefunden <cmath> .Now the C++ overloads have been removed from <math.h> and are only found in <cmath>.

    Um Fehler zu beheben, schließen Sie ein, <cmath> um die Deklarationen der Funktionen zu erhalten, die aus entfernt wurden <math.h> .To resolve errors, include <cmath> to get the declarations of the functions that were removed from <math.h>. Die folgenden Funktionen wurden entfernt:These functions were moved:

    • double abs(double) und float abs(float)double abs(double) and float abs(float)

    • double pow(double, int), float pow(float, float), float pow(float, int), long double pow(long double, long double), long double pow(long double, int)double pow(double, int), float pow(float, float), float pow(float, int), long double pow(long double, long double), long double pow(long double, int)

    • float und- long double Versionen der Gleit Komma Funktionen,,,, acos acosh asin asinh atan , atanh , atan2 , cbrt ,, ceil copysign , cos , cosh , erf ,,,,,,, erfc exp exp2 expm1 fabs fdim floor , fma , fmax ,,,,, fmin fmod frexp hypot ilogb ,,,,,,,,, ldexp , lgamma llrint llround log log10 log1p log2 lrint lround modf nearbyint nextafter nexttoward remainder remquo rint round scalbln scalbn sin sinh sqrt tan tanh tgamma ,,,,,,,,,,,,,,,, undtruncfloat and long double versions of floating point functions acos, acosh, asin, asinh, atan, atanh, atan2, cbrt, ceil, copysign, cos, cosh, erf, erfc, exp, exp2, expm1, fabs, fdim, floor, fma, fmax, fmin, fmod, frexp, hypot, ilogb, ldexp, lgamma, llrint, llround, log, log10, log1p, log2, lrint, lround, modf, nearbyint, nextafter, nexttoward, remainder, remquo, rint, round, scalbln, scalbn, sin, sinh, sqrt, tan, tanh, tgamma, and trunc

    Wenn Sie über Code verfügen, der abs mit einem Gleit kommatyp verwendet, der nur den- <math.h> Header enthält, sind die Gleit Komma Versionen nicht mehr verfügbar.If you have code that uses abs with a floating point type that only includes the <math.h> header, the floating point versions will no longer be available. Der Aufruf wird nun in abs(int) aufgelöst, selbst wenn ein Gleitkommaargument vorhanden ist, wodurch der folgende Fehler ausgelöst wird:The call now resolves to abs(int), even with a floating point argument, which produces the error:

    warning C4244: 'argument' : conversion from 'float' to 'int', possible loss of data
    

    Die Behebung für diese Warnung besteht darin, den-Aufrufvorgang abs durch eine Gleit Komma Version von zu ersetzen, z. b. abs fabs für ein doppeltes Argument oder fabsf für ein Float-Argument, oder den <cmath> -Header einzuschließen und weiterhin zu verwenden abs .The fix for this warning is to replace the call to abs with a floating point version of abs, such as fabs for a double argument or fabsf for a float argument, or include the <cmath> header and continue to use abs.

  • GleitkommakonformitätFloating point conformance

    Viele an der math-Bibliothek vorgenommenen Änderungen wurden zur Verbesserung der Konformität mit den im Anhang F enthaltenen IEEE-754- und C11-Spezifikationen in Bezug auf Eingaben bei Sonderfällen wie NaN- und unendliche Werte.Many changes to the math library have been made to improve conformance to the IEEE-754 and C11 Annex F specifications with respect to special case inputs such as NaNs and infinities. Stille NaN-Eingaben, die in früheren Bibliotheksversionen häufig als Fehler behandelt wurden, werden z. B. nicht mehr als Fehler behandelt.For example, quiet NaN inputs, which were often treated as errors in previous versions of the library, are no longer treated as errors. Weitere Informationen finden Sie unter IEEE 754-Standard und Anhang F des C11-Standards.See IEEE 754 Standard and Annex F of the C11 Standard.

    Diese Änderungen führen nicht zu Kompilierungsfehlern, können jedoch dazu führen, dass Programme ggf. ein anderes und standardkonformeres Verhalten aufweisen.These changes won't cause compile-time errors, but might cause programs to behave differently and more correctly according to the standard.

  • FLT_ROUNDSFLT_ROUNDS

    Das FLT_ROUNDS-Makro wurde in Visual Studio 2013 auf einen konstanten Ausdruck erweitert, was nicht korrekt war, da der Rundungsmodus, z. B. beim Aufruf von fesetround, zur Laufzeit konfigurierbar ist.In Visual Studio 2013, the FLT_ROUNDS macro expanded to a constant expression, which was incorrect because the rounding mode is configurable at runtime, for example, by calling fesetround. Das FLT_ROUNDS-Makro ist jetzt dynamisch und spiegelt ordnungsgemäß den aktuellen Rundungsmodus wider.The FLT_ROUNDS macro is now dynamic and correctly reflects the current rounding mode.

<new> und <new.h><new> and <new.h>

  • new und deletenew and delete

    In früheren Bibliotheksversionen wurden die in der Implementierung definierten Operatorfunktionen „new“ und „delete“ aus der DLL-Datei der Laufzeitbibliothek (z. B. msvcr120.dll) exportiert.In previous versions of the library, the implementation-defined operator new and delete functions were exported from the runtime library DLL (for example, msvcr120.dll). Dieser Operatorfunktionen sind immer statisch mit Ihren Binärdateien verknüpft, selbst wenn DLL-Dateien der Laufzeitbibliothek verwendet werden.These operator functions are now always statically linked into your binaries, even when using the runtime library DLLs.

    Für nativen oder gemischten Code (/clr) stellt dies keinen Breaking Change dar. Für Code, der jedoch als /clr:pure kompiliert wurde, kann diese Änderung zu Fehlern beim Kompilieren führen.This isn't a breaking change for native or mixed code (/clr), however for code compiled as /clr:pure, this change might cause your code to fail to compile. Wenn Sie Code als /clr:pure kompilieren, müssen Sie möglicherweise #include <new> oder #include <new.h>hinzufügen, um Buildfehler aufgrund dieser Änderung zu umgehen.If you compile code as /clr:pure, you may need to add #include <new> or #include <new.h> to work around build errors due to this change. Die Option /clr:pure ist seit Visual Studio 2015 veraltet und wird seit Visual Studio 2017 nicht mehr unterstützt.The/clr:pure option is deprecated in Visual Studio 2015 and unsupported in Visual Studio 2017. Code der „rein“ sein muss, sollte zu C# portiert werden.Code that needs to be "pure" should be ported to C#.

<process.h>

  • _beginthread und _beginthreadex_beginthread and _beginthreadex

    Die _beginthread- und _beginthreadex-Funktionen enthalten jetzt einen Verweis auf das Modul, in dem die Threadprozedur für die Dauer des Threads definiert wird.The _beginthread and _beginthreadex functions now hold a reference to the module in which the thread procedure is defined for the duration of the thread. Dadurch wird sichergestellt, dass Module nicht entladen werden, bis ein Thread vollständig ausgeführt wurde.This helps to ensure that modules aren't unloaded until a thread has run to completion.

<stdarg.h>

  • va_start und Verweistypenva_start and reference types

    Beim Kompilieren von C++-Code prüft va_start nun zur Kompilierzeit, dass das übergebene Argument kein Verweistyp ist.When compiling C++ code, va_start now validates at compile-time that the argument passed to it isn't of reference type. Verweistyp-Argumente sind gemäß dem C++-Standard nicht zulässig.Reference-type arguments are prohibited by the C++ Standard.

<stdio.h>und<conio.h><stdio.h> and <conio.h>

  • Die printf- und scanf-Funktionsreihe werden nun inline definiert.The printf and scanf family of functions are now defined inline.

    Die Definitionen aller printf -und- scanf Funktionen wurden Inline in <stdio.h> , <conio.h> und andere CRT-Header verschoben.The definitions of all of the printf and scanf functions have been moved inline into <stdio.h>, <conio.h>, and other CRT headers. Dieser Breaking Change führt zu einem Linkerfehler (LNK2019: Unresolved External Symbol (LNK2019: nicht aufgelöstes externes Symbol)) für alle Programme, die diese Funktionen ohne entsprechende CRT-Header lokal deklariert haben.This breaking change leads to a linker error (LNK2019, unresolved external symbol) for any programs that declared these functions locally without including the appropriate CRT headers. Sie sollten nach Möglichkeit den Code um die CRT-Header (d.h. #include <stdio.h>) und die Inlinefunktionen ergänzen. Wenn Sie diese Headerdateien nicht zu Ihrem Code hinzufügen möchten, können Sie alternativ eine Bibliothek zur Linkereingabe, „legacy_stdio_definitions.lib“, hinzufügen.If possible, you should update the code to include the CRT headers (that is, add #include <stdio.h>) and the inline functions, but if you do not want to modify your code to include these header files, an alternative solution is to add an additional library to your linker input, legacy_stdio_definitions.lib.

    Öffnen Sie zum Hinzufügen dieser Bibliothek zu Ihrer Linkereingabe in IDE das Kontextmenü für den Projektknoten, wählen Sie Eigenschaften und anschließend im Dialogfeld Projekteigenschaften den Eintrag Linker aus. Bearbeiten Sie anschließend die Linkereingabe, um legacy_stdio_definitions.lib zur durch Semikolons getrennten Liste hinzuzufügen.To add this library to your linker input in the IDE, open the context menu for the project node, choose Properties, then in the Project Properties dialog box, choose Linker, and edit the Linker Input to add legacy_stdio_definitions.lib to the semi-colon-separated list.

    Wenn Ihr Projekt mit statischen Bibliotheken verknüpft ist, die mit einem früheren Visual Studio-Release als 2015 kompiliert wurden, meldet der Linker möglicherweise ein nicht aufgelöstes externes Symbol.If your project links with static libraries that were compiled with a release of Visual Studio earlier than 2015, the linker might report an unresolved external symbol. Diese Fehler können auf interne Definitionen für _iob , _iob_func oder Verwandte Importe für bestimmte <stdio.h> Funktionen in Form von _IMP_verweisen * .These errors might reference internal definitions for _iob, _iob_func, or related imports for certain <stdio.h> functions in the form of imp*. Microsoft empfiehlt, alle statischen Bibliotheken mit der neuesten Version von C++-Compiler und -Bibliotheken zu kompilieren, wenn Sie ein Upgrade für ein Projekt durchführen.Microsoft recommends that you recompile all static libraries with the latest version of the C++ compiler and libraries when you upgrade a project. Wenn die Bibliothek eine Drittanbieterbibliothek ohne verfügbare Quelle ist, sollten Sie entweder eine aktualisierte Binärdatei vom Drittanbieter anfordern oder die Verwendung dieser Bibliothek in einer separaten DLL kapseln, die Sie mit einer älteren Version des Compilers und Bibliotheken kompilieren.If the library is a third-party library for which source isn't available, you should either request an updated binary from the third party or encapsulate your usage of that library into a separate DLL that you compile with the older version of the compiler and libraries.

    Warnung

    Wenn Sie eine Verknüpfung mit Windows SDK 8.1 oder früher erstellen, tritt ggf. der Fehler „nicht aufgelöstes externes Symbol“ auf.If you are linking with Windows SDK 8.1 or earlier, you might encounter these unresolved external symbol errors. Fügen Sie zur Behebung dieses Fehlers in diesem Fall legacy_stdio_definitions.lib zu der Linkerausgabe wie bereits beschrieben hinzu.In that case, you should resolve the error by adding legacy_stdio_definitions.lib to the linker input as described previously.

    Um nicht aufgelöste symbolfehler zu beheben, können Sie versuchen, die in einer Binärdatei definierten Symbole mithilfe von dumpbin.exe zu überprüfen.To troubleshoot unresolved symbol errors, you can try using dumpbin.exe to examine the symbols defined in a binary. Verwenden Sie zum Anzeigen der in einer Bibliothek definierten Symbole die folgende Befehlszeile.Try the following command line to view symbols defined in a library.

    dumpbin.exe /LINKERMEMBER somelibrary.lib
    
  • gets und _getwsgets and _getws

    Die gets- und _getws-Funktionen wurden entfernt.The gets and _getws functions have been removed. Die gets-Funktion wurde in C11 aus der C-Standardbibliothek entfernt, da keine sichere Verwendung dieser Funktion gewährleistet werden kann.The gets function was removed from the C Standard Library in C11 because it can't be used securely. Bei der _getws-Funktion handelte es sich um eine Microsoft-Erweiterung, die der gets-Funktion für Breitzeichenfolgen entsprach.The _getws function was a Microsoft extension that was equivalent to gets but for wide strings. Alternativen zu dieser Funktionen stellen fgets, fgetws, gets_sund _getws_sdar.As alternatives to these functions, consider use of fgets, fgetws, gets_s, and _getws_s.

  • _cgets und _cgetws_cgets and _cgetws

    Die cets- und _cgetws-Funktionen wurden entfernt.The _cgets and _cgetws functions have been removed. Alternativen zu diesen Funktionen stellen _cgets_s und _cgetws_sdar.As alternatives to these functions, consider use of _cgets_s and _cgetws_s.

  • Formatierung von unendlichen Werten und NaN-WertenInfinity and NaN Formatting

    In früheren Versionen wurden unendliche und NaN-Werte mit einem Satz MSVC-spezifischer Sentinelzeichenfolgen formatiert.In previous versions, infinities and NaNs would be formatted using a set of MSVC-specific sentinel strings.

    • Unendlich: 1.#INFInfinity: 1.#INF

    • Stiller NaN: 1. #QNANQuiet NaN: 1.#QNAN

    • Signaling-NaN: 1.#SNANSignaling NaN: 1.#SNAN

    • Unbestimmter NaN: 1. #INDIndefinite NaN: 1.#IND

    All diesen Formaten konnte ein Vorzeichen vorangestellt werden und sie wurden möglicherweise je nach Feldbreite und Genauigkeit unterschiedlich formatiert (in einigen Fällen führte dies zu ungewöhnlichen Auswirkungen, beispielsweise würde printf("%.2f\n", INFINITY) „1.#J“ zurückgeben, weil „#INF“ auf zwei Stellen gerundet werden würde).Any of these formats may have been prefixed by a sign and may have been formatted slightly differently depending on field width and precision (sometimes with unusual effects, for example printf("%.2f\n", INFINITY) would print 1.#J because the #INF would be "rounded" to a 2-digit precision). In C99 wurden neue Anforderungen an die Formatierung von unendlichen und NaN-Werten eingeführt.C99 introduced new requirements on how infinities and NaNs are to be formatted. Die MSVC-Implementierung entspricht nun diesen Anforderungen.The MSVC implementation now conforms to these requirements. Die neuen Zeichenfolgen lauten wie folgt:The new strings are as follows:

    • Unendlich: infInfinity: inf

    • Stiller NaN: nanQuiet NaN: nan

    • Signaling-NaN: nan(snan)Signaling NaN: nan(snan)

    • Unbestimmter NaN: nan(ind)Indefinite NaN: nan(ind)

    All diesen Werten kann ein Vorzeichen vorangestellt werden.Any of these may be prefixed by a sign. Bei Verwendung eines großgeschriebenen Formatspezifizierers (%F statt %f) werden die Zeichenfolgen wie angefordert in Großbuchstaben ausgegeben (INF statt inf).If a capitalized format specifier is used (%F instead of %f), then the strings are printed in capital letters (INF instead of inf), as is required.

    Die scanf-Funktionen analysieren die neuen Zeichenfolgen so, dass nun ein Roundtrip über printf und scanf für diese ausgeführt wird.The scanf functions have been modified to parse these new strings, so these strings now round-trip through printf and scanf.

  • Formatierung und Analyse von GleitkommawertenFloating point formatting and parsing

    Neue Formatierung von Gleitkommawerten und Analysealgorithmen wurden zur Verbesserung der Genauigkeit eingeführt.New floating point formatting and parsing algorithms have been introduced to improve correctness. Diese Änderung wirkt sich auf die printf- und scanf-Funktionsreihen sowie auf Funktionen wie strtod aus.This change affects the printf and scanf families of functions, as well as functions like strtod.

    Mit den alten Formatierungsalgorithmen wurde nur eine begrenzte Zifferanzahl erzeugt und die übrigen Dezimalstellen wurden mit 0 dargestellt.The old formatting algorithms would generate only a limited number of digits, then would fill the remaining decimal places with zero. Sie konnten in der Regel Zeichenfolgen generieren, für die ein Roundtrip zum ursprünglichen Gleitkommawert durchgeführt wird. Wenn Sie jedoch den exakten Wert (oder den nächstliegenden Dezimalwert) benötigten, war dies nicht ausreichend.They could usually generate strings that would round-trip back to the original floating point value, but weren't great if you wanted the exact value (or the closest decimal representation thereof). Mit den neuen Formatierungsalgorithmen werden beliebig viele Ziffern zur Darstellung des Werts (oder der angegeben Genauigkeit) generiert.The new formatting algorithms generate as many digits as are required to represent the value (or to fill the specified precision). Schauen Sie sich als Beispiel für die Verbesserung die Ergebnisse bei der Ausgabe einer hohen Potenz von zwei an:As an example of the improvement; consider the results when printing a large power of two:

    printf("%.0f\n", pow(2.0, 80))
    

    Alte Ausgabe:Old output:

    1208925819614629200000000
    

    Neue Ausgabe:New output:

    1208925819614629174706176
    

    Mit den alten Analysealgorithmen werden nur bis zu 17 signifikante Ziffern aus der Eingabezeichenfolge berücksichtigt und die restlichen Ziffern verworfen.The old parsing algorithms would consider only up to 17 significant digits from the input string and would discard the rest of the digits. Dieser Ansatz ist ausreichend, um einen durch die Zeichenfolge dargestellten Näherungswert zu generieren. Das Ergebnis liegt in der Regel nah am richtig gerundeten Ergebnis.This approach is sufficient to generate a close approximation of the value represented by the string, and the result is usually very close to the correctly rounded result. Mit der neuen Implementierung werden alle vorhanden Ziffern berücksichtigt und das ordnungsgemäß gerundete Ergebnis für alle Eingaben (bis zu 768 Ziffern) generiert.The new implementation considers all present digits and produces the correctly rounded result for all inputs (up to 768 digits in length). Darüber hinaus berücksichtigen diese Funktionen nun den Rundungsstatus (steuerbar über fesetround).In addition, these functions now respect the rounding mode (controllable via fesetround). Da diese Funktionen möglicherweise verschiedene Ergebnisse ausgeben, stellt dies einen potenziellen Breaking Behavior Change dar.This is potentially a breaking behavior change because these functions might output different results. Die neuen Ergebnisse sind in jedem Fall genauer als die alten Ergebnisse.The new results are always more correct than the old results.

  • Analyse von Gleitkommawerten bei Hexadezimalzahlen und unendlichen Werten sowie NaN-WertenHexadecimal and infinity/NaN floating point parsing

    Mit den Analysealgorithmen für Gleitkommawerte werden nun Zeichenfolgen mit Hexadezimal-Gleitkommawerten (z. B. die von %a- und %A-Ausgabeformatspezifizierer generierten) und alle unendlichen und NaN-Zeichenfolgen, die von den printf-Funktionen generiert werden, wie oben beschrieben analysiert.The floating point parsing algorithms will now parse hexadecimal floating point strings (such as the ones generated by the %a and %A printf format specifiers) and all infinity and NaN strings that are generated by the printf functions, as described above.

  • Auffüllung mit Nullen mithilfe von %A und %a%A and %a zero padding

    Mit den %a- und %A-Formatspezifizierern werden Gleitkommawerte als Hexadezimalmantisse und binärer Exponent formatiert.The %a and %A format specifiers format a floating point number as a hexadecimal mantissa and binary exponent. In früheren Versionen wurden mit den printf-Funktionen die Zeichenfolgen nicht ordnungsgemäß mit Nullen aufgefüllt.In previous versions, the printf functions would incorrectly zero-pad strings. Beispiel: printf("%07.0a\n", 1.0) hat 00x1p+0 ausgegeben, statt 0x01p+0.For example, printf("%07.0a\n", 1.0) would print 00x1p+0, where it should print 0x01p+0. Dieser Fehler wurde behoben.This flaw has been fixed.

  • Genauigkeit von %A und %a%A and %a precision

    Die Standardgenauigkeit der %A- und %a-Formatspezifizierer lag in früheren Bibliotheksversionen bei 6.The default precision of the %A and %a format specifiers was 6 in previous versions of the library. Die Standardgenauigkeit liegt jetzt bei 13 und entspricht somit dem C-Standard.The default precision is now 13 for conformance with the C Standard.

    Dies ist eine Laufzeitverhaltensänderung in der Ausgabe von jeder Funktion, die eine Zeichenfolge mit %A oder % verwendet.This is a runtime behavior change in the output of any function that uses a format string with %A or %a. Beim alten Verhalten lautete die Ausgabe bei Verwendung des %A-Spezifizierers möglicherweise „1.1A2B3Cp+111“.In the old behavior, the output using the %A specifier might be "1.1A2B3Cp+111". Die Ausgabe für den gleichen Wert lautet nun „1.1A2B3C4D5E6F7p + 111“.Now the output for the same value is "1.1A2B3C4D5E6F7p+111". Zum Wiederherstellen des alten Verhaltens können Sie die Genauigkeit angeben, z. B. %.6A.To get the old behavior, you can specify the precision, for example, %.6A. Siehe Genauigkeitsangabe.See Precision Specification.

  • %F-Spezifizierer%F specifier

    Der %F-Format-/Konvertierungsspezifizierer wird nun unterstützt.The %F format/conversion specifier is now supported. Abgesehen davon, dass unendliche und NaN-Werte mithilfe von Großbuchstaben formatiert werden, weist er die gleiche Funktionsweise wie der Formatspezifizierer „%f“ auf.It's functionally equivalent to the %f format specifier, except that infinities and NaNs are formatted using capital letters.

    In früheren Versionen wurden F# und N als Längenmodifizierer von der Implementierung analysiert.In previous versions, the implementation used to parse F and N as length modifiers. Dieses Verhalten geht auf segmentierte Adressräume zurück: Mit diesen Längenspezifizierern wurden ferne und nahe Zeiger wie in %Fp oder %Ns ermittelt.This behavior dated back to the age of segmented address spaces: these length modifiers were used to indicate far and near pointers, respectively, as in %Fp or %Ns. Dieses Verhalten wurde entfernt.This behavior has been removed. Wenn „%F“ ermittelt wird, wird es nun als %F-Formatspezifizierer behandelt. Wenn „%N“ ermittelt wird, wird es nun als ungültiger Parameter behandelt.If %F is encountered, it's now treated as the %F format specifier; if %N is encountered, it's now treated as an invalid parameter.

  • Formatierung von ExponentenExponent formatting

    Mit den %e- und %E-Formatspezifizierern werden Gleitkommawerte als Dezimalmantisse und Exponent formatiert.The %e and %E format specifiers format a floating point number as a decimal mantissa and exponent. Die %g- und %G-Formatspezifizierer formatieren die Zahlen in einigen Fällen auf die gleiche Weise.The %g and %G format specifiers also format numbers in this form in some cases. In früheren Versionen wurden Zeichenfolgen immer mit Exponenten mit drei Ziffern von der CRT generiert.In previous versions, the CRT would always generate strings with three-digit exponents. Beispielsweise würde printf("%e\n", 1.0) 1.000000e+000 ausgeben, was falsch war.For example, printf("%e\n", 1.0) would print 1.000000e+000, which was incorrect. C erfordert, dass bei Exponenten, die mit nur einer oder zwei Ziffern dargestellt werden können, auch nur zwei Ziffern ausgegeben werden.C requires that if the exponent is representable using only one or two digits, then only two digits are to be printed.

    In Visual Studio 2005 wurde eine globale Übereinstimmungsoption hinzugefügt: _set_output_format.In Visual Studio 2005 a global conformance switch was added: _set_output_format. Ein Programm konnte diese Funktion mit dem Argument _TWO_DIGIT_EXPONENT aufrufen, um die übereinstimmende Ausgabe von Exponenten zu aktivieren.A program could call this function with the argument _TWO_DIGIT_EXPONENT, to enable conforming exponent printing. Das Standardverhalten wurde zum standardkonformen Exponentenausgabemodus geändert.The default behavior has been changed to the standards-conforming exponent printing mode.

  • Validierung der FormatzeichenfolgeFormat string validation

    In früheren Versionen haben die printf- und scanf-Funktionen viele ungültige automatisch Formatzeichenfolgen akzeptiert, was in einigen Fällen zu ungewöhnlichen Ergebnissen geführt hat.In previous versions, the printf and scanf functions would silently accept many invalid format strings, sometimes with unusual effects. %hlhlhld wurde beispielsweise als %d behandelt.For example, %hlhlhld would be treated as %d. Alle ungültigen Formatzeichenfolgen werden jetzt als ungültige Parameter behandelt.All invalid format strings are now treated as invalid parameters.

  • Überprüfung der fopen-Moduszeichenfolgenfopen mode string validation

    In früheren Versionen hat die fopen-Funktionsreihe einige ungültige Moduszeichenfolgen einfach akzeptiert, z. B. r+b+.In previous versions, the fopen family of functions silently accepted some invalid mode strings, such as r+b+. Ungültige Moduszeichenfolgen werden nun erkannt und als ungültige Parameter behandelt.Invalid mode strings are now detected and treated as invalid parameters.

  • _O_U8TEXT-Modus_O_U8TEXT mode

    Die _setmode-Funktion meldet jetzt ordnungsgemäß den Modus für im _O_U8TEXT-Modus geöffnete Streams.The _setmode function now correctly reports the mode for streams opened in_O_U8TEXT mode. In früheren Bibliotheksversionen wurden solche Streams als in _O_WTEXT geöffnete Streams gekennzeichnet.In previous versions of the library, it would report such streams as being opened in _O_WTEXT.

    Dies ist eine wichtige Änderung, wenn Ihr Code den _O_WTEXT-Modus für Streams bei der UTF-8-Codierung interpretiert.This is a breaking change if your code interprets the _O_WTEXT mode for streams where the encoding is UTF-8. Wenn UTF_8 von Ihrer Anwendung nicht unterstützt wird, sollten Sie in Erwägung ziehen, Unterstützung für diese immer häufiger verwendete Codierung hinzuzufügen.If your application doesn't support UTF_8, consider adding support for this increasingly common encoding.

  • snprintf und vsnprintfsnprintf and vsnprintf

    Die snprintf- und vsnprintf-Funktionen sind jetzt implementiert.The snprintf and vsnprintf functions are now implemented. Älterer Code stellte häufig die Versionen der Makrodefinitionen dieser Funktionen bereit, da sie nicht von der CRT-Bibliothek implementiert wurden. In neueren Versionen ist dies nicht länger erforderlich.Older code often provided definitions macro versions of these functions because they were not implemented by the CRT library, but they're no longer needed in newer versions. Wenn snprintf oder vsnprintf vor dem einschließen als Makro definiert ist <stdio.h> , schlägt die Kompilierung jetzt mit einem Fehler fehl, der angibt, wo das Makro definiert wurde.If snprintf or vsnprintf is defined as a macro before including <stdio.h>, compilation now fails with an error that indicates where the macro was defined.

    In der Regel kann dieser Fehler behoben werden, indem alle Deklarationen von snprintf oder vsnprintf im Benutzercode gelöscht werden.Normally, the fix to this problem is to delete any declarations of snprintf or vsnprintf in user code.

  • tmpnam generiert verwendbare Dateinamentmpnam Generates Usable File Names

    In früheren Versionen wurden mit den tmpnam- und tmpnam_s-Funktionen Dateinamen im Stammverzeichnis des Laufwerks (z.B. \sd3c.) geniert.In previous versions, the tmpnam and tmpnam_s functions generated file names in the root of the drive (such as \sd3c.). Mit diesen Funktionen werden jetzt verwendbare Dateinamenpfade in einem temporären Verzeichnis generiert.These functions now generate usable file name paths in a temporary directory.

  • FILE-KapselungFILE Encapsulation

    In früheren Versionen wurde der gesamte Dateityp in öffentlich definiert <stdio.h> , sodass der Benutzercode in eine Datei gelangen und seine internale ändern konnte.In previous versions, the complete FILE type was defined publicly in <stdio.h>, so it was possible for user code to reach into a FILE and modify its internals. Die Bibliothek blendet nun detaillierte Informationen zur Implementierung aus.The library has been changed to hide implementation details. Im Rahmen dieser Änderung ist die Datei, wie Sie in definiert <stdio.h> ist, jetzt ein nicht transparenter Typ, und auf die Member kann nicht von außerhalb der CRT selbst zugegriffen werden.As part of this change, FILE as defined in <stdio.h> is now an opaque type and its members are inaccessible from outside of the CRT itself.

  • _outp und _inp_outp and _inp

    Die Funktionen _outp, _outpw, _outpd, _inp, _inpw und _inpd wurden entfernt.The functions _outp, _outpw, _outpd, _inp, _inpw, and _inpd have been removed.

<stdlib.h>, <malloc.h> und <sys/stat.h><stdlib.h>, <malloc.h>, and <sys/stat.h>

  • strtof und wcstofstrtof and wcstof

    Die Funktionen strtof und wcstof konnten errno nicht auf ERANGE festlegen, wenn der Wert nicht als float-Eigenschaft dargestellt werden konnte.The strtof and wcstof functions failed to set errno to ERANGE when the value wasn't representable as a float. Dieser Fehler galt nur für diese zwei Funktionen. Die Funktionen strtod, wcstod, strtold und wcstold waren nicht betroffen.This error was specific to these two functions; the strtod, wcstod, strtold, and wcstold functions were unaffected. Dieses Problem wurde behoben und stellt einen Breaking Change für die Laufzeit dar.This issue has been fixed, and is a runtime breaking change.

  • Ausgerichtete SpeicherbelegungsfunktionenAligned allocation functions

    In früheren Versionen haben die ausgerichteten Zuordnungsfunktionen (_aligned_malloc, _aligned_offset_malloc usw.) automatisch Anforderungen für einen Block mit einer Ausrichtung von 0 (null) akzeptiert.In previous versions, the aligned allocation functions (_aligned_malloc, _aligned_offset_malloc, etc.) would silently accept requests for a block with an alignment of 0. Die angeforderte Ausrichtung muss eine Potenz von zwei sein, was bei „0“ (null) nicht der Fall ist.The requested alignment must be a power of two, which isn't true of zero. Angeforderte Ausrichtungen von „0“ (null) werden nun als ungültige Parameter behandelt.A requested alignment of 0 is now treated as an invalid parameter. Dieses Problem wurde behoben und stellt einen Breaking Change für die Laufzeit dar.This issue has been fixed, and is a runtime breaking change.

  • HeapfunktionenHeap functions

    Die Funktionen _heapadd, _heapset und _heapused wurden entfernt.The _heapadd, _heapset, and _heapused functions have been removed. Diese Funktionen waren nicht funktionsfähig, seit die CRT für die Verwendung des Windows-Heaps aktualisiert wurde.These functions have been nonfunctional since the CRT was updated to use the Windows heap.

  • smallheapsmallheap

    Die Linkoption smallheap wurde entfernt.The smallheap link option has been removed. Siehe Linkoptionen.See Link Options.

<string.h>

  • wcstokwcstok

    Die Signatur der Funktion wcstok wurde geändert und erfüllt jetzt die Anforderungen des C-Standards.The signature of the wcstok function has been changed to match what is required by the C Standard. In früheren Versionen der Bibliothek sah die Signatur dieser Funktion wie folgt aus:In previous versions of the library, the signature of this function was:

    wchar_t* wcstok(wchar_t*, wchar_t const*)
    

    Sie verwendete internen threadspezifischen Kontext, um den Status aller Aufrufe nachzuverfolgen, wie für strtok durchgeführt.It used an internal, per-thread context to track state across calls, as is done for strtok. Die Funktion weist jetzt die Signatur wchar_t* wcstok(wchar_t*, wchar_t const*, wchar_t**) auf und macht erforderlich, dass der Aufrufer den Kontext als drittes Argument an die Funktion übergibt.The function now has the signature wchar_t* wcstok(wchar_t*, wchar_t const*, wchar_t**), and requires the caller to pass the context as a third argument to the function.

    Eine neue _wcstok-Funktion mit der alten Signatur wurde hinzugefügt, um das Portieren zu erleichtern.A new _wcstok function has been added with the old signature to ease porting. Beim Kompilieren von C++-Code ist auch eine Inlineüberladung von wcstok mit der alten Signatur vorhanden.When compiling C++ code, there is also an inline overload of wcstok that has the old signature. Diese Überladung ist veraltet.This overload is declared as deprecated. In C-Code können Sie mit define_CRT_NON_CONFORMING_WCSTOK möglicherweise festlegen, dass _wcstok anstelle von wcstok verwendet wird.In C code, you may define_CRT_NON_CONFORMING_WCSTOK to cause _wcstok to be used in place of wcstok.

<time.h>

  • clockclock

    In früheren Versionen wurde die clock-Funktion mit der Windows-API GetSystemTimeAsFileTime implementiert.In previous versions, the clock function was implemented using the Windows API GetSystemTimeAsFileTime. Durch diese Implementierung war die die clock-Funktion von der Systemzeit abhängig, und war daher nicht monoton.With this implementation, the clock function was sensitive to the system time, and was thus not necessarily monotonic. Die clock-Funktion wurde hinsichtlich QueryPerformanceCounter neu implementiert und ist jetzt monoton.The clock function has been reimplemented in terms of QueryPerformanceCounter and is now monotonic.

  • fstat und_utimefstat and _utime

    In früheren Versionen haben die _stat-, fstat- und _utime-Funktionen die Sommerzeit nicht ordnungsgemäß behandelt.In previous versions, the _stat, fstat, and _utime functions handle daylight savings time incorrectly. Vor Visual Studio 2013 haben all diese Funktionen die Normalzeiten fälschlicherweise als Sommerzeit behandelt.Prior to Visual Studio 2013, all of these functions incorrectly adjusted standard time times as if they were in daylight time.

    In Visual Studio 2013 wurde das Problem in der _stat -Funktions Familie behoben, aber die ähnlichen Probleme in den Funktionen " f " und " _utime " wurden nicht korrigiert.In Visual Studio 2013, the problem was fixed in the _stat family of functions, but the similar problems in the fstat and _utime families of functions were not fixed. Diese Teilkorrektur führte zu Problemen aufgrund von Inkonsistenzen zwischen den Funktionen.This partial fix led to problems due to the inconsistency between the functions. Die Funktionen " f " und " _utime " wurden nun korrigiert, sodass alle diese Funktionen nun die Sommerzeit ordnungsgemäß und konsistent behandeln.The fstat and _utime families of functions have now been fixed, so all of these functions now handle daylight savings time correctly and consistently.

  • asctimeasctime

    In früheren Versionen hat die asctime-Funktion einstellige Tagesangaben mit einer führenden „0“ (null) aufgefüllt, z. B. Fri Jun 06 08:00:00 2014.In previous versions, the asctime function would pad single-digit days with a leading zero, for example: Fri Jun 06 08:00:00 2014. Die Spezifikation erfordert, dass diese Tage wie bei Fri Jun 6 08:00:00 2014 mit einem führenden Leerzeichen aufgefüllt werden.The specification requires that such days be padded with a leading space, as in Fri Jun 6 08:00:00 2014. Dieses Problem wurde behoben.This issue has been fixed.

  • strftime und wcsftimestrftime and wcsftime

    Die Funktionen strftime und wcsftime unterstützen jetzt die Formatspezifizierer %C, %D, %e, %F, %g, %G, %h, %n, %r, %R, %t, %T, %u und %V.The strftime and wcsftime functions now support the %C, %D, %e, %F, %g, %G, %h, %n, %r, %R, %t, %T, %u, and %V format specifiers. Darüber hinaus werden die E- und O-Modifizierer analysiert, aber ignoriert.Additionally, the E and O modifiers are parsed but ignored.

    Der %c-Formatspezifizierer erzeugt „Entsprechende Datum- und Uhrzeitdarstellung“ für das aktuelle Gebietsschema.The %c format specifier is specified as producing an "appropriate date and time representation" for the current locale. Im C-Gebietsschema muss diese Darstellung mit %a %b %e %T %Y übereinstimmen. Dabei handelt es sich um das gleiche Format, das von asctime erzeugt wird.In the C locale, this representation is required to be the same as %a %b %e %T %Y, the same form as is produced by asctime. In früheren Versionen hat der Formatspezifizierer „%c“ die Zeiten nicht ordnungsgemäß formatiert und sie in der Form MM/DD/YY HH:MM:SS dargestellt.In previous versions, the %c format specifier incorrectly formatted times using a MM/DD/YY HH:MM:SS representation. Dieses Problem wurde behoben.This issue has been fixed.

  • timespec und TIME_UTCtimespec and TIME_UTC

    Der <time.h> -Header definiert nun den timespec -Typ und die- timespec_get Funktion aus dem C11-Standard.The <time.h> header now defines the timespec type and the timespec_get function from the C11 Standard. Darüber hinaus ist das TIME_UTC-Makro jetzt für die Verwendung mit der Funktion timespec_get definiert.In addition, the TIME_UTC macro, for use with the timespec_get function, is now defined. Dieses Update stellt einen Breaking Change für Code dar, der einen Konflikt mit der Definition für diese Bezeichner aufweist.This update is a breaking change for code that has a conflicting definition for any of these identifiers.

  • CLOCKS_PER_SECCLOCKS_PER_SEC

    Das CLOCKS_PER_SEC-Makro wird jetzt auf eine ganze Zahl des Typs clock_t erweitert, wie für C erforderlich.The CLOCKS_PER_SEC macro now expands to an integer of type clock_t, as required by the C language.

C++-Standard BibliothekC++ Standard Library

Um neue Optimierungen und Debuggingüberprüfungen zu aktivieren, unterbricht die Visual Studio-Implementierung der C++-Standardbibliothek absichtlich die binäre Kompatibilität von einer Version zur nächsten.To enable new optimizations and debugging checks, the Visual Studio implementation of the C++ Standard Library intentionally breaks binary compatibility from one version to the next. Wenn die C++-Standardbibliothek verwendet wird, können Objektdateien und statische Bibliotheken, die unter Verwendung von verschiedenen Versionen kompiliert werden, nicht in einer Binärdatei (EXE oder DLL) vermischt werden, und C++-Standardbibliotheksobjekte können nicht zwischen Binärdateien übergeben werden, die mit verschiedenen Versionen kompiliert werden.Therefore, when the C++ Standard Library is used, object files and static libraries that are compiled by using different versions can't be mixed in one binary (EXE or DLL), and C++ Standard Library objects can't be passed between binaries that are compiled by using different versions. Eine solche Kombination gibt Linkerfehler über _MSC_VER-Konflikte aus.Such mixing emits linker errors about _MSC_VER mismatches. (_MSC_VER ist das Makro, das die Hauptversion des Compilers enthält – z. b. 1800 für Visual Studio 2013.) Diese Überprüfung kann keine DLL-Mischung erkennen und keine Vermischung erkennen, die Visual Studio 2008 oder früher betrifft.(_MSC_VER is the macro that contains the compiler's major version—for example, 1800 for Visual Studio 2013.) This check can't detect DLL mixing, and can't detect mixing that involves Visual Studio 2008 or earlier.

  • Includedateien der C++-StandardbibliothekC++ Standard Library include files

    Es wurden einige Änderungen an der Includestruktur in den Headern der C++-Standardbibliothek vorgenommen.Some changes have been made to the include structure in the C++ Standard Library headers. Header der C++-Standardbibliothek dürfen einander nicht auf unbekannte Weise enthalten.C++ Standard Library headers are allowed to include each other in unspecified ways. Im Allgemeinen sollten Sie Code schreiben, der sorgfältig alle entsprechend dem C++-Standard benötigten Header enthält, und nicht darauf beruht, welche Header der C++-Standardbibliothek in anderen Headern der C++-Standardbibliothek enthalten sind.In general, you should write your code so that it carefully includes all of the headers that it needs according to the C++ standard, and doesn't rely on which C++ Standard Library headers include which other C++ Standard Library headers. Dadurch kann der Code für andere Versionen und Plattformen verwendet werden.This makes code portable across versions and platforms. Mindestens zwei Headeränderungen in Visual Studio 2015 wirken sich auf den Benutzercode aus.At least two header changes in Visual Studio 2015 affect user code. Erstens <string> enthält nicht mehr <iterator> .First, <string> no longer includes <iterator>. Zweitens <tuple> deklariert jetzt std::array ohne Angabe von <array> , was Code durch die folgende Kombination von Codekonstrukten unterbrechen kann: der Code weist eine Variable mit dem Namen "Array" auf, und Sie verfügen über eine using-Direktive "using namespace Std;", und Sie fügen einen C++-Standard Bibliotheks Header (z <functional> . b.) ein <tuple> , der nun deklariert std::array .Second, <tuple> now declares std::array without including all of <array>, which can break code through the following combination of code constructs: your code has a variable named "array", and you have a using-directive "using namespace std;", and you include a C++ Standard Library header (such as <functional>) that includes <tuple>, which now declares std::array.

  • steady_clocksteady_clock

    Die <chrono> Implementierung von steady_clock wurde geändert, um die C++-Standard Anforderungen für die steadität und monoton zu erfüllen.The <chrono> implementation of steady_clock has changed to meet the C++ Standard requirements for steadiness and monotonicity. steady_clockbasiert nun auf QueryPerformanceCounter und high_resolution_clock ist jetzt eine typedef für steady_clock .steady_clock is now based on QueryPerformanceCounter and high_resolution_clock is now a typedef for steady_clock. Aus diesem Grund ist steady_clock::time_point in Visual Studio jetzt ein typedef-Element für chrono::time_point<steady_clock>. Dies ist jedoch nicht unbedingt bei anderen Implementierungen der Fall.As a result, in Visual Studio steady_clock::time_point is now a typedef for chrono::time_point<steady_clock>; however, this isn't necessarily the case for other implementations.

  • Speicherbelegungen und Konstantenallocators and const

    Es sind nun Vergleiche der Zuordnungen erforderlich, um Konstantenargumente zu akzeptieren.We now require allocator equality/inequality comparisons to accept const arguments on both sides. Wenn Ihre Zuweisungen diese Operatoren auf folgende Weise definieren,If your allocators define these operators like this,

    bool operator==(const MyAlloc& other)
    

    sollten Sie sie aktualisieren und als const-Member deklarieren:then you should update them and declare them as const members:

    bool operator==(const MyAlloc& other) const
    
  • const-Elementeconst elements

    Der C++-Standard hat Container von Konstanten Elementen (z. b. Vector <const T> oder Set <const T> ) immer untersagt.The C++ standard has always forbidden containers of const elements (such as vector<const T> or set<const T>). In Visual Studio 2013 und in früheren Versionen waren solche Container zulässig.Visual Studio 2013 and earlier accepted such containers. In der aktuellen Version tritt beim Kompilieren dieser Container ein Fehler auf.In the current version, such containers fail to compile.

  • std::allocator::deallocatestd::allocator::deallocate

    In Visual Studio 2013 und früheren Versionen hat std::allocator::deallocate(p, n) das für n übergebene Argument ignoriert.In Visual Studio 2013 and earlier, std::allocator::deallocate(p, n) ignored the argument passed in for n. Der C++-Standard erfordert, dass n dem Wert entspricht, der als erstes Argument für den Aufruf dem von p zurückgegebenen allocate-Spezifizierer entspricht.The C++ standard has always required that n must be equal to the value passed as the first argument to the invocation of allocate which returned p. In der aktuellen Version wird jedoch der Wert n untersucht.However, in the current version, the value of n is inspected. Code, der Argumente für n übergibt, die sich vom Standard unterscheiden, könnte zur Laufzeit abstürzen.Code that passes arguments for n that differ from what the standard requires might crash at runtime.

  • hash_map und hash_sethash_map and hash_set

    Die nicht standardmäßigen Header Dateien <hash_map> und <hash_set> sind in Visual Studio 2015 veraltet und werden in einer zukünftigen Version entfernt.The non-standard header files <hash_map> and <hash_set> are deprecated in Visual Studio 2015 and will be removed in a future release. Verwenden Sie stattdessen <unordered_map> und <unordered_set>.Use <unordered_map> and <unordered_set> instead.

  • Vergleichsoperatoren und operator()comparators and operator()

    Assoziative Container (die- <map> Familie) erfordern nun, dass Ihre Vergleichs Operatoren über konstant Aufruf Bare Funktionsaufruf Operatoren verfügen.Associative containers (the <map> family) now require their comparators to have const-callable function call operators. Beim Ausführen des folgenden Codes tritt nun in einer Vergleichsklassendeklaration ein Fehler beim Kompilieren auf:The following code in a comparator class declaration now fails to compile:

    bool operator()(const X& a, const X& b)
    

    Ändern Sie zur Behebung dieses Problems die Funktionsdeklaration zu der folgenden:To resolve this error, change the function declaration to:

    bool operator()(const X& a, const X& b) const
    
  • Typmerkmaletype traits

    Die alten Namen für Typmerkmale aus einer früheren Version des C++-Standardentwurfs wurden entfernt.The old names for type traits from an earlier version of the C++ draft standard have been removed. Diese wurden in C++11 auf die C++11-Werte in Visual Studio 2015 aktualisiert.These were changed in C++11 and have been updated to the C++11 values in Visual Studio 2015. In der folgenden Tabelle werden die alten und neuen Namen aufgeführt.The following table shows the old and new names.

    Alter NameOld name Neuer NameNew name
    add_referenceadd_reference add_lvalue_referenceadd_lvalue_reference
    has_default_constructorhas_default_constructor is_default_constructibleis_default_constructible
    has_copy_constructorhas_copy_constructor is_copy_constructibleis_copy_constructible
    has_move_constructorhas_move_constructor is_move_constructibleis_move_constructible
    has_nothrow_constructorhas_nothrow_constructor is_nothrow_default_constructibleis_nothrow_default_constructible
    has_nothrow_default_constructorhas_nothrow_default_constructor is_nothrow_default_constructibleis_nothrow_default_constructible
    has_nothrow_copyhas_nothrow_copy is_nothrow_copy_constructibleis_nothrow_copy_constructible
    has_nothrow_copy_constructorhas_nothrow_copy_constructor is_nothrow_copy_constructibleis_nothrow_copy_constructible
    has_nothrow_move_constructorhas_nothrow_move_constructor is_nothrow_move_constructibleis_nothrow_move_constructible
    has_nothrow_assignhas_nothrow_assign is_nothrow_copy_assignableis_nothrow_copy_assignable
    has_nothrow_copy_assignhas_nothrow_copy_assign is_nothrow_copy_assignableis_nothrow_copy_assignable
    has_nothrow_move_assignhas_nothrow_move_assign is_nothrow_move_assignableis_nothrow_move_assignable
    has_trivial_constructorhas_trivial_constructor is_trivially_default_constructibleis_trivially_default_constructible
    has_trivial_default_constructorhas_trivial_default_constructor is_trivially_default_constructibleis_trivially_default_constructible
    has_trivial_copyhas_trivial_copy is_trivially_copy_constructibleis_trivially_copy_constructible
    has_trivial_move_constructorhas_trivial_move_constructor is_trivially_move_constructibleis_trivially_move_constructible
    has_trivial_assignhas_trivial_assign is_trivially_copy_assignableis_trivially_copy_assignable
    has_trivial_move_assignhas_trivial_move_assign is_trivially_move_assignableis_trivially_move_assignable
    has_trivial_destructorhas_trivial_destructor is_trivially_destructibleis_trivially_destructible
  • launch::any- und launch::sync-Richtlinienlaunch::any and launch::sync policies

    Der nicht dem Standard entsprechenden launch::any- und launch::sync-Richtlinien wurden entfernt.The nonstandard launch::any and launch::sync policies were removed. Stattdessen wird launch:async | launch:deferred für launch::any verwendet.Instead, for launch::any, use launch:async | launch:deferred. Verwenden Sie launch::deferred für launch::sync.For launch::sync, use launch::deferred. Siehe launch-Enumeration.See launch Enumeration.

MFC und ATLMFC and ATL

  • Microsoft Foundation Classes (MFC)Microsoft Foundation Classes (MFC)

    ist aufgrund seiner Größe nicht mehr in der Standardinstallation von Visual Studio enthalten.is no longer included in a "Typical" install of Visual Studio because of its large size. Um MFC zu installieren, wählen Sie die Option benutzerdefinierte Installation in Visual Studio 2015-Setup aus.To install MFC, choose the Custom install option in Visual Studio 2015 setup. Wenn Sie Visual Studio 2015 bereits installiert haben, können Sie MFC installieren, indem Sie das Visual Studio-Setup erneut ausführen.If you already have Visual Studio 2015 installed, you can install MFC by running Visual Studio setup again. Wählen Sie die Installationsoption Benutzerdefiniert, und wählen Sie dann die Option Microsoft Foundation Classes aus.Choose the Custom install option, and then choose Microsoft Foundation Classes. Sie können das Visual Studio-Setup in der Systemsteuerung über das Steuerelement Programme und Features oder über das Installationsmedium ausführen.You can run Visual Studio setup from the Control Panel control Programs and Features, or from the installation media.

    Diese Bibliothek ist weiterhin im Visual C++ Redistributable Package enthalten.The Visual C++ Redistributable Package still includes this library.

Concurrency RuntimeConcurrency Runtime

  • Yield-Makro aus „Windows.h“ weist einen Konflikt auf mit concurrency::Context::YieldYield macro from Windows.h conflicting with concurrency::Context::Yield

    Die Concurrency Runtime verwendete zuvor #undef, um die Yield-Makrodefinition zur Vermeidung von Konflikten zwischen dem in Windows.h und der concurrency::Context::Yield-Funktion definierten Yield-Makro aufzuheben.The Concurrency Runtime previously used #undef to undefine the Yield macro to avoid conflicts between the Yield macro defined in Windows.h h and the concurrency::Context::Yield function. #undef wurde entfernt, und es wurde ein neuer nicht in Konflikt stehender äquivalenter API-Aufruf, concurrency::Context::YieldExecution, hinzugefügt.This #undef has been removed and a new non-conflicting equivalent API call concurrency::Context::YieldExecution has been added. Zur Umgehung von Konflikten mit Yield können Sie entweder den Code stattdessen zum Aufrufen der Funktion YieldExecution aktualisieren, oder den Namen der Funktion Yield auf der Aufrufsite wie im folgenden Beispiel aufgeführt durch Klammern umschließen:To work around conflicts with Yield, you can either update your code to call the YieldExecution function instead, or surround the Yield function name with parentheses at call sites, as in the following example:

    (concurrency::Context::Yield)();
    

Verbesserungen der Übereinstimmung des Compilers mit Standards in Visual Studio 2015Compiler Conformance Improvements in Visual Studio 2015

Wenn Sie Code aus früheren Versionen upgraden, können auch Compilerfehler auftreten, die die Folge von Verbesserungen der Überstimmung mit Standards in Visual Studio 2015 sind.When upgrading code from previous versions, you might also encounter compiler errors that are due to conformance improvements made in Visual Studio 2015. Diese Verbesserungen unterbrechen nicht die Binärkompatibilität früherer Versionen von Visual Studio, können aber zu Compilerfehlern führen, die zuvor nicht aufgetreten sind.These improvements do not break binary compatibility from earlier versions of Visual Studio, but they can produce compiler errors where none were emitted before. Weitere Informationen finden Sie unter Visual C++: Neuerungen 2003 bis 2015.For more information, see Visual C++ What's New 2003 through 2015.

In Visual Studio 2015 können fortlaufende Verbesserungen der Compilerkonformität mitunter ändern, wie der Compiler den vorhandenen Quellcode versteht.In Visual Studio 2015, ongoing improvements to compiler conformance can sometimes change how the compiler understands your existing source code. Aus diesem Grund treten während Ihres Builds ggf. neue oder andere Fehler oder sogar Verhaltensunterschiede im Code auf, für den zuvor Builds erstellt wurden und die Ausführung ordnungsgemäß schien.As a result, you might encounter new or different errors during your build, or even behavioral differences in code that previously built and seemed to run correctly.

Diese Änderungen haben jedoch nur wenig oder keinen Einfluss auf den Großteil Ihres Quellcodes.Fortunately, these differences have little or no impact on most of your source code. Wenn Quellcode- oder andere Änderungen erforderlich sind, um diese Unterschiede zu beheben, sind diese Korrekturen eher klein und einfach.When source code or other changes are needed to address these differences, the fixes tend to be small and straight-forward. Wir haben zahlreiche Beispiele für zuvor zulässigen Quellcode, die möglicherweise geändert werden müssen (vorher), und die Updates zur Korrektur (nachher) hinzugefügt.We've included many examples of previously acceptable source code that might need to be changed (before) and the fixes to correct them (after).

Obwohl diese Unterschiede sich auf Ihren Quellcode oder andere Buildartefakte auswirken können, wirken sie sich nicht auf die Binärkompatibilität zwischen Updates für Visual Studio-Versionen aus.Although these differences can affect your source code or other build artifacts, they don't affect binary compatibility between updates to Visual Studio versions. Ein Breaking Change ist schwerwiegender und kann sich auf die Kompatibilität mit Binärdateien auswirken. Diese Arten von Beeinträchtigung der Binärkompatibilität treten jedoch nur zwischen Hauptversionen von Visual Studio auf, z. B. zwischen Visual Studio 2013 und Visual Studio 2015.A breaking change is more severe, and can affect binary compatibility, but these kinds of binary compatibility breaks only occur between major versions of Visual Studio, for example, between Visual Studio 2013 and Visual Studio 2015. Informationen zu bedeutenden Änderungen, die zwischen Visual Studio 2013 und Visual Studio 2015 vorgenommen wurden, finden Sie unter Visual Studio 2015: Änderungen bei der Übereinstimmung mit Standards.For information on the breaking changes that occurred between Visual Studio 2013 and Visual Studio 2015, see Visual Studio 2015 Conformance Changes.

Verbesserungen der Konformität in Visual Studio 2015Conformance Improvements in Visual Studio 2015

  • /Zc:forScope-Option/Zc:forScope- option

    Die Compileroption /Zc:forScope- ist veraltet und wird in einem der nächsten Releases entfernt.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
    

    Diese Option wurde in der Regel für nicht dem Standard entsprechenden Code verwendet, der Schleifenvariablen gemäß dem Standard nach dem Punkt verwendet, an dem diese den Gültigkeitsbereich verlassen sollten.Usually, this option was 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. Dies war nur erforderlich, wenn Sie die /Za-Option zum Kompilieren verwendet haben, da die Verwendung einer Schleifenvariable ohne /Za nach dem Ende der Schleife immer zulässig ist.It was only necessary when you compiled with the /Za option, since without /Za, use of a for loop variable after the end of the loop is always allowed. Wenn die Einhaltung von Standards keine Rolle spielt (z.B. wenn der Code nicht auf andere Compiler übertragbar ist), können Sie die /Za-Option deaktivieren (oder die Eigenschaft Spracherweiterungen deaktivieren auf Nein festlegen).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). Wenn Sie übertragbaren Code schreiben möchten, der den Standards entspricht, sollten Sie den Code umschreiben, indem Sie die Deklaration der Variablen an eine Stelle außerhalb der Schleifen verschieben.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.

    // 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 Compileroption/Zg compiler option

    Die /Zg-Compileroption (Funktionsprototypen generieren) ist nicht mehr verfügbar.The /Zg compiler option (Generate Function Prototypes) is no longer available. Diese Compileroption wurde zuvor als veraltet markiert.This compiler option was previously deprecated.

  • Sie können Komponententests nicht mehr mit C++/CLI über die Befehlszeile mit der „mstest.exe“ ausführen.You can no longer run unit tests with C++/CLI from the command line with mstest.exe. Verwenden Sie stattdessen vstest.console.exe.Instead, use vstest.console.exe. Siehe Befehlszeilenoptionen für VSTest.Console.exe.See VSTest.Console.exe command-line options.

  • änderbare-Schlüsselwortmutable keyword

    Der mutable Speicherklassenspezifizierer ist an Orten, an denen er zuvor ohne Fehler kompiliert wurde, nicht mehr zulässig.The mutable storage class specifier is no longer allowed in places where previously it compiled without error. Der Compiler generiert nun den Fehler C2071 (Ungültige Speicherklasse).Now, the compiler gives error C2071 (illegal storage class). Gemäß dem Standard mutable kann der Spezifizierer nur auf Namen von klassendatenmembern angewendet werden und kann nicht auf Namen angewendet werden, die als "konstant" oder "statisch" deklariert sind, und kann nicht auf Verweismember angewendet werden.According to the standard, the mutable specifier can be applied only to names of class data members, and can't be applied to names declared const or static, and can't be applied to reference members.

    Beachten Sie z. B. folgenden Code:For example, consider the following code:

    struct S
    {
        mutable int &r;
    };
    

    In früheren Versionen des Compilers war dies zulässig, jetzt generiert der Compiler jedoch den folgenden Fehler:Previous versions of the compiler accepted this, but now the compiler gives the following error:

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

    Entfernen Sie das redundante Schlüsselwort, um den Fehler zu beheben mutable .To fix the error, remove the redundant mutable keyword.

  • char_16_t und char32_tchar_16_t and char32_t

    Sie können nicht mehr char16_t oder char32_t als Aliase in einem verwenden typedef , da diese Typen nun als integriert behandelt werden.You can no longer use char16_t or char32_t as aliases in a typedef, because these types are now treated as built-in. Es war üblich, dass Benutzer und Bibliotheks Autoren und char16_t char32_t als Aliase von uint16_t uint32_t bzw. definieren.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;
    }
    

    Um den Code zu aktualisieren, entfernen Sie die typedef Deklarationen und benennen alle anderen Bezeichner um, die mit diesen Namen in Konflikt stehen.To update your code, remove the typedef declarations and rename any other identifiers that collide with these names.

  • Nichttyp-VorlagenparameterNon-type template parameters

    Bestimmter Code mit Nichttyp-Vorlagenparametern wird auf Typkompatibilität korrekt geprüft, wenn Sie explizite Vorlagenargumente bereitstellen.Certain code that involves non-type template parameters is now correctly checked for type compatibility when you provide explicit template arguments. Der folgende Code wurde z.B. ohne Fehler in früheren Versionen von Visual Studio kompiliert.For example, the following code compiled without error in previous versions of Visual Studio.

    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>();
    }
    

    Der aktuelle Compiler generiert ordnungsgemäß einen Fehler, da der Typ des Vorlagenparameters nicht mit dem Vorlagenargument übereinstimmt (der Parameter ist ein Zeiger auf einen konstanten Member, die f-Funktion ist jedoch nicht konstant):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'
    

    Stellen Sie zum Beheben dieses Fehlers im Code sicher, dass der Typ des verwendeten Vorlagenarguments mit dem deklarierten Typ des Vorlagenparameters übereinstimmt.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)

    Der Compiler lässt __declspec(align) in Funktionen nicht mehr zu.The compiler no longer accepts __declspec(align) on functions. Dieses Konstrukt wurde bisher ignoriert, nun wird jedoch ein Compilerfehler generiert.This construct was always ignored, but now it produces a compiler error.

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

    Entfernen Sie zum Beheben dieses Problems __declspec(align) aus der Funktionsdeklaration.To fix this problem, remove __declspec(align) from the function declaration. Da dies keine Auswirkungen hatte, ändert sich durch das Entfernen nichts.Since it had no effect, removing it doesn't change anything.

  • AusnahmebehandlungException handling

    Es gibt eine Reihe von Änderungen bei der Ausnahmebehandlung.There are a couple of changes to exception handling. Ausnahmeobjekte müssen kopiert oder verschoben werden können.First, exception objects have to be either copyable or movable. Der folgende Code wird zwar in Visual Studio 2013 kompiliert, aber nicht in Visual Studio 2015:The following code compiled in Visual Studio 2013, but doesn't compile in Visual Studio 2015:

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

    Das Problem besteht darin, dass der Kopierkonstruktor privat ist. Somit kann das Objekt nicht während des normalen Betriebs der Ausnahmebehandlung kopiert werden.The problem is that the copy constructor is private, so the object can't be copied as happens in the normal course of handling an exception. Dasselbe gilt, wenn der Kopierkonstruktor deklariert wird explicit .The same applies when the copy constructor is declared explicit.

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

    Stellen Sie zum Aktualisieren des Codes sicher, dass der Kopierkonstruktor für Ihr Ausnahme Objekt ist public und nicht markiert ist explicit .To update your code, make sure that the copy constructor for your exception object is public and not marked explicit.

    Beim Abfangen einer Ausnahme nach Wert muss das Ausnahmeobjekt ebenfalls kopiert werden können.Catching an exception by value also requires the exception object to be copyable. Der folgende Code wird zwar in Visual Studio 2013 kompiliert, aber nicht in Visual Studio 2015:The following code compiled in Visual Studio 2013, but doesn't compile in Visual Studio 2015:

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

    Sie können dieses Problem beheben, indem Sie den Parametertyp für catch auf einen Verweis ändern.You can fix this issue by changing the parameter type for the catch to a reference.

    catch (D& d)
    {
    }
    
  • Zeichenfolgenliterale gefolgt von MakrosString literals followed by macros

    Der Compiler unterstützt nun benutzerdefinierte Literale.The compiler now supports user-defined literals. Folglich werden Zeichenfolgenliterale, auf die Makros ohne dazwischenliegende Leerzeichen folgen, als benutzerdefinierte Literale interpretiert, was zu Fehlern oder unerwarteten Ergebnissen führen kann.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. In vorherigen Compilern wurde der beispielsweise der folgende Code erfolgreich kompiliert: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;
    }
    

    Der Compiler interpretierte diesen Code als ein Zeichenfolgenliteral „Hello“ gefolgt von einem Makro, das in „there“ erweitert wird, und führte die zwei Zeichenfolgenliterale zu einer verketteten Zeichenfolge zusammen.The compiler interpreted this code as a string literal "hello" followed by a macro, which is expanded into "there", and then the two string literals were concatenated into one. In Visual Studio 2015 interpretiert der Compiler diese Sequenz als ein benutzerdefiniertes Literal. Da kein entsprechendes benutzerdefiniertes _x-Literal definiert ist, wird jedoch ein Fehler generiert.In Visual Studio 2015, the compiler interprets this sequence 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?
    

    Fügen Sie zur Behebung dieses Problems ein Leerzeichen zwischen das Zeichenfolgenliteral und das Makro ein.To fix this problem, add a space between the string literal and the macro.

  • Angrenzende ZeichenfolgenliteraleAdjacent string literals

    Auf ähnliche Weise wurden angrenzende Zeichenfolgenliterale ohne Leerzeichen aufgrund von zugehörigen Änderungen in der Zeichenfolgenanalyse als eine verkettete Zeichenfolge in den vorherigen Versionen von Visual C++ interpretiert.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++. In Visual Studio 2015 müssen Sie ein Leerzeichen zwischen den beiden Zeichenfolgen hinzufügen.In Visual Studio 2015, you must now add whitespace between the two strings. Der folgende Code muss z. B. geändert werden:For example, the following code must be changed:

    char * str = "abc""def";
    

    Fügen Sie ein Leerzeichen zwischen den beiden Zeichenfolgen hinzu, um dieses Problem zu beheben:To fix this issue, add a space in between the two strings:

    char * str = "abc" "def";
    
  • Platzierungsoperatoren „new“ und „delete“Placement new and delete

    Der Operator hat eine Änderung vorgenommen, um eine delete Übereinstimmung mit dem c++ 14-Standard zu erzielen.A change has been made to the delete operator in order to bring it into conformance with C++14 standard. Detaillierte Informationen zur Standardänderung finden Sie unter Aufhebung der Zuordnung mit C++-Größeninformationen.Details of the standards change can be found at C++ Sized Deallocation. Die Änderungen fügen eine Form des globalen delete Operators hinzu, der einen size-Parameter annimmt.The changes add a form of the global delete operator that takes a size parameter. Wenn Sie zuvor einen Operator delete mit derselben Signatur verwendet haben (um einem Platzierungs Operator new zu entsprechen), erhalten Sie einen Compilerfehler (nämlich c2956, der an dem Punkt auftritt, an dem die Platzierung New verwendet wird, da dies die Position im Code ist, an der der Compiler versucht, einen entsprechenden übereinstimmenden Operator zu identifizieren delete ). Breaking ChangeThe 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).

    Bei der Funktion void operator delete(void *, size_t) hat es sich um einen delete-Platzierungsoperator gehandelt, der der Funktion void * operator new(size_t, size_t) des Platzierungsoperators new in C++11 entspricht.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. Bei der Aufhebung der Zuordnung von c++ 14 entspricht diese Delete-Funktion nun der üblichen Zuordnungs Funktion (globaler delete Operator).With C++14 sized deallocation, this delete function is now a usual deallocation function (global delete operator). Der Standard erfordert es, dass das Programm bei Verwendung eines Platzierungsoperators „new“, der eine entsprechenden delete-Funktion sucht und eine gewöhnliche Funktion zum Aufheben der Zuordnung ermittelt, nicht ordnungsgemäß formatiert ist.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.

    Nehmen Sie beispielsweise an, dass Ihr Code sowohl eine Platzierung New als auch eine Platzierungs Löschungdefiniert: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;
    

    Das Problem tritt aufgrund der Entsprechung in den Funktions Signaturen zwischen einem von Ihnen definierten Platzierungs Lösch Operator und dem neuen globalen Größen delete Operator auf.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. Stellen Sie sich vor, ob Sie einen anderen Typ als size_t für die Platzierung neuer -und- delete Operatoren verwenden können.Consider whether you can use a different type other than size_t for any placement new and delete operators. Der Typ des size_t typedef ist vom Compiler abhängig; er ist ein typedef für unsigned int in MSVC.The type of the size_t typedef is compiler-dependent; it's a typedef for unsigned int in MSVC. Eine gute Lösung hierfür stellt die Verwendung eines enumerierten Typs wie die des folgenden dar:A good solution is to use an enumerated type such as this one:

    enum class my_type : size_t {};
    

    Ändern Sie dann die Definition der Platzierung New , und delete verwenden Sie diesen Typ als zweites Argument anstelle von size_t .Then, change your definition of placement new and delete to use this type as the second argument instead of size_t. Sie müssen auch die Aufrufe von Platzierung New aktualisieren, um den neuen Typ zu übergeben (z. b. mithilfe von static_cast<my_type> , um den ganzzahligen Wert zu konvertieren) und die Definition von und aktualisieren, new delete um Sie wieder in den ganzzahligen Typ umzuwandeln.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. Hierfür müssen Sie keinen verwenden enum . ein Klassentyp mit einem size_t Member würde ebenfalls funktionieren.You don't need to use an enum for this; a class type with a size_t member would also work.

    Eine alternative Lösung besteht darin, dass Sie möglicherweise die Platzierung der neuen Platzierung vollständig ausschließen können.An alternative solution is that you might be able to eliminate the placement new altogether. Wenn Ihr Code die Platzierung New verwendet, um einen Speicherpool zu implementieren, bei dem das Platzierungs Argument die Größe des zugeordneten oder gelöschten Objekts ist, kann das Feature zum Aufheben der Speicher Belegung geeignet sein, um den eigenen benutzerdefinierten Speicherpool Code zu ersetzen, und Sie können die Platzierungsfunktionen entfernen und einfach einen eigenen Operator mit zwei Argumenten delete anstelle der Platzierungsfunktionen verwenden.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.

    Wenn Sie Ihren Code nicht sofort aktualisieren möchten, können Sie mit der Compileroption /Zc:sizedDealloc- das alte Verhalten wiederherstellen.If you don't want to update your code immediately, you can revert to the old behavior by using the compiler option /Zc:sizedDealloc-. Wenn Sie diese Option verwenden, sind die Delete-Funktionen mit zwei Argumenten nicht vorhanden und führen nicht zu einem Konflikt mit dem Platzierungs Lösch Operator.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-DatenmemberUnion data members

    Union-Datenmember dürfen über keine Verweistypen verfügen.Data members of unions can no longer have reference types. Der folgende Code kompiliert zwar in Visual Studio 2013 erfolgreich, aber erzeugt in Visual Studio 2015 einen Fehler.The following code compiled successfully in Visual Studio 2013, but produces an error in Visual Studio 2015.

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

    Der oben genannte Code geniert die folgenden Fehler: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
    

    Ändern Sie zur Behebung dieses Fehlers die Verweistypen in einen Zeiger oder einen Wert.To address this issue, change reference types either to a pointer or a value. Für die Änderung des Typs in einen Zeiger sind Änderungen im Code erforderlich, der das Union-Feld verwendet.Changing the type to a pointer requires changes in the code that uses the union field. Durch die Änderung des Codes in einen Wert werden die in der Union gespeicherten Daten geändert, was Auswirkungen auf andere Felder hat, da Felder in Uniontypen den gleichen Speicher gemeinsam verwenden.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. Je nach Wertgröße kann dies ggf. auch die Größe der Union ändern.Depending on the size of the value, it might also change the size of the union.

  • Anonyme Unions weisen nun eine größere Standardkonformität auf.Anonymous unions are now more conformant to the standard. Frühere Versionen des Compilers haben einen expliziten Konstruktor und Destruktor für anonyme Unions generiert.Previous versions of the compiler generated an explicit constructor and destructor for anonymous unions. Diese vom Compiler generierten Funktionen werden in Visual Studio 2015 gelöscht.These compiler-generated functions are deleted in Visual Studio 2015.

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

    Der oben genannte Code geniert in Visual Studio 2015 den folgenden Fehler:The preceding code generates the following error 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
    

    Geben Sie zur Behebung dieses Fehlers eigene Definitionen des Konstruktors und/oder des Destruktors an.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 mit anonymen StrukturenUnions with anonymous structs

    Zur Einhaltung des Standards wurde das Laufzeitverhalten für Member anonymer Strukturen in Unions geändert.In order to conform with the standard, the runtime behavior has changed for members of anonymous structures in unions. Der Konstruktor für anonyme Strukturmember in einer Union wird nicht mehr implizit aufgerufen, wenn eine solche Union erstellt wird.The constructor for anonymous structure members in a union is no longer implicitly called when such a union is created. Der Destruktor für anonyme Strukturmember in einer Union wird nicht mehr implizit aufgerufen, wenn die Union den Gültigkeitsbereich verlässt.Also, the destructor for anonymous structure members in a union is no longer implicitly called when the union goes out of scope. Betrachten Sie den folgenden Code, in dem der Union-Typ „U“ eine anonyme Struktur enthält, die wiederum die benannte Memberstruktur „S“ enthält, die einen Destruktor aufweist.Consider the following code, in which a union U contains an anonymous structure that contains a named member 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;
    }
    

    Der Konstruktor für S wird in Visual Studio 2013 immer dann aufgerufen, wenn die Union erstellt wird, und der Destruktor für S wird immer dann aufgerufen, wenn der Stapel für Funktion f bereinigt wird.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. In Visual Studio 2015 werden jedoch weder der Konstruktor noch der Destruktor aufgerufen.But in Visual Studio 2015, the constructor and destructor aren't called. Der Compiler gibt eine Warnung zu dieser Verhaltensänderung aus.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
    

    Benennen Sie zum Wiederherstellen des ursprünglichen Verhaltens die anonyme Struktur.To restore the original behavior, give the anonymous structure a name. Das Laufzeitverhalten von nicht anonymen Strukturen ist von der Compilerversion unabhängig.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;
    }
    

    Verschieben Sie alternativ den Konstruktor- und Destruktorcode in die neuen Funktionen, und fügen Sie diesen Funktionen aus der Konstruktor- und Destruktorunion Aufrufe hinzu.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;
    }
    
  • VorlagenauflösungTemplate resolution

    Es wurden Änderungen an der Namensauflösung für Vorlagen vorgenommen.Changes have been made to name resolution for templates. Bei Berücksichtigung der Kandidaten für eine Namensauflösung können potenzielle Namen in C++ ggf. eine ungültige Vorlageninstanziierung erzeugen.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. Diese ungültigen Instanziierungen generieren in der Regel keine Compilerfehler, dies ist das SFINAE-Prinzip (Ersetzungsfehler sind keine Fehler).These invalid instantiations do not normally cause compiler errors, a principle known as SFINAE (Substitution Failure Is Not An Error).

    Wenn der Compiler jetzt von SFINAE zum Instanziieren der Spezialisierung einer Klassenvorlage aufgefordert wird, handelt es sich bei allen während dieses Prozesses aufgetretenen Fehler um Compilerfehler.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 früheren Versionen hat der Compiler diese Fehler ignoriert.In previous versions, the compiler would ignore such errors. Beachten Sie z. B. folgenden Code: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);
    }
    

    Beim Kompilieren mit dem aktuellen Compiler tritt der folgende Fehler auf: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
    ]
    

    Der Grund hierfür ist, dass die Klasse D zum Zeitpunkt des ersten Aufrufs von is_base_of noch nicht definiert war.This is because at the point of the first invocation of the is_base_of the class D hasn't been defined yet.

    In diesem Fall besteht die Lösung darin, diese Typmerkmale nicht zu verwenden, bis die Klasse definiert wurde.In this case, the fix is to not use such type traits until the class has been defined. Wenn Sie die Definitionen von B und D an den Anfang der Codedatei verschieben, wird der Fehler behoben.If you move the definitions of B and D to the beginning of the code file, the error is resolved. Überprüfen Sie, wenn sich die Definitionen in Headerdateien befinden, die Reihenfolge der Include-Anweisungen für die Headerdateien, um sicherzustellen, dass alle Klassendefinitionen kompiliert werden, bevor die problematischen Vorlagen verwendet werden.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.

  • KopierkonstruktorenCopy constructors

    Sowohl in Visual Studio 2013 als auch in Visual Studio 2015 generiert der Compiler einen Kopierkonstruktor für eine Klasse, die über einen benutzerdefinierten Bewegungskonstruktor verfügt, jedoch über keinen benutzerdefinierten Kopierkonstruktor.In both Visual 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. In Dev14 wird dieser implizit generierte Kopierkonstruktor ebenfalls als „= delete“ gekennzeichnet.In Dev14, this implicitly generated copy constructor is also marked "= delete".

  • Als externes „C“ deklariertes main benötigt nun einen Rückgabetypmain declared as extern "C" now requires a return type.

    Mit dem folgenden Code wird nun C4430 generiert.The following code now produces C4430.

    extern "C" __cdecl main(){} // C4430
    

    Um den Fehler zu beheben, fügen Sie den Rückgabetyp hinzu:To fix the error, add the return type:

    extern "C" int __cdecl main(){} // OK
    
  • typename ist in Memberinitialisierer nicht zulässigtypename isn't allowed in a member initializer

    Mit dem folgenden Code wird nun C2059 generiert:The following code now produces C2059:

    template<typename T>
    struct S1 : public T::type
    {
        S1() : typename T::type() // C2059
        {
        }
    };
    
    struct S2 {
        typedef S2 type;
    };
    
    S1<S2> s;
    

    Entfernen Sie typename aus dem Initialisierer, um den Fehler zu beheben:To fix the error, remove typename from the initializer:

    S1() : T::type() // OK
    ...
    
  • Speicherklasse für explizite Spezialisierungen wird ignoriertThe storage class on explicit specializations is ignored.

    Im folgenden Code wird der statische Speicherklassenspezifizierer ignoriert.In the following code, the static storage class specifier is ignored

    template <typename T>
    void myfunc(T h)
    {
    }
    
    template<>
    static void myfunc(double h) // static is ignored
    {
    }
    
  • Eine Konstante, die in static_assert innerhalb einer Klassenvorlage verwendet wird, verursacht stets einen FehlerA constant used in a static_assert inside a class template will always fail.

    Der folgende Code bewirkt static_assert , dass immer fehlschlägt:The following code causes the static_assert to always fail:

    template <size_t some_value>
    struct S1
    {
        static_assert(false, "default not valid"); // always invoked
    
    };
    
    //other partial specializations here
    

    Um dieses Problem zu umgehen, umschließen Sie den Wert in einem struct :To work around this issue, wrap the value in a struct:

    template <size_t some_value>
    struct constant_false {
        static const bool value = false;
    };
    
    template <size_t some_value>
    struct S1
    {
        static_assert(constant_false<some_value>::value, "default not valid");
    };
    
    //other partial specializations here
    
  • Regeln, die für vorwärts Deklarationen erzwungen werden. (Gilt nur für C.)Rules enforced for forward declarations. (Applies only to C.)

    Mit dem folgenden Code wird nun C2065 generiert:The following code now produces C2065:

    struct token_s;
    typedef int BOOL;
    typedef int INT;
    
    typedef int(*PFNTERM)(PTOKEN, BOOL, INT); // C2065: 'PTOKEN' : undeclared identifier
    

    Fügen Sie zum Beheben dieses Problems die entsprechenden Vorwärtsdeklarationen hinzu:To fix this problem, add the proper forward declarations:

    struct token_s;
    typedef int BOOL;
    typedef int INT;
    
    // forward declarations:
    typedef struct token_s TOKEN;
    typedef TOKEN *PTOKEN;
    
    typedef int(*PFNTERM)(PTOKEN, BOOL, INT);
    
  • Konsistentere Erzwingung von FunktionszeigertypenMore consistent enforcement of function pointer types

    Mit dem folgenden Code wird nun C2197 generiert:The following code now produces C2197:

    typedef int(*F1)(int);
    typedef int(*F2)(int, int);
    
    void func(F1 f, int v1, int v2)
    {
        f(v1, v2); // C2197
    }
    
  • Mehrdeutige Aufrufe überladener FunktionenAmbiguous calls to overloaded functions

    Der folgende Code erzeugt nun C266: „N::bind“: Mehrdeutiger Aufruf einer überladenen FunktionThe following code now produces C266: 'N::bind': ambiguous call to overloaded function

    template<typename R, typename T, typename T1, typename A1>
    void bind(R(T::*)(T1), A1&&);
    
    namespace N
    {
        template <typename T, typename R, typename ... Tx>
        void bind(R(T::*)(Tx...), T* ptr);
    }
    
    using namespace N;
    
    class Manager
    {
    public:
        void func(bool initializing);
    
        void mf()
        {
            bind(&Manager::func, this); //C2668
        }
    };
    

    Zur Behebung des Fehlers können Sie den Aufruf von bind: N::bind(...) vollständig qualifizieren.To fix the error, you can fully qualify the call to bind: N::bind(...). Wenn diese Änderung jedoch über einen nicht deklarierten Bezeichner (C2065) erfolgt, kann es sinnvoll sein, dies mit einer using Deklaration zu beheben.However, if this change is manifest through an undeclared identifier (C2065), then it may be appropriate to fix this with a using declaration instead.

    Dieses Muster tritt häufig mit „ComPtr“ und anderen Typen im Namespace Microsoft::WRL auf.This pattern happens frequently with ComPtr and other types in the Microsoft::WRL namespace.

  • Korrigieren der falschen AdresseFix incorrect address of

    Mit dem folgenden Code wird nun C2440 generiert: '=': Konvertierung von „type *“ in „type“ nicht möglich.The following code now produces C2440: '=': cannot convert from 'type *' to 'type'. Ändern Sie zum Beheben dieses Fehler „&(type)“ in „(type)“ und „(&f())“ in „(f())“.To fix the error, change &(type) to (type) and (&f()) to (f()).

    // C
    typedef void (*type)(void);
    
    void f(int i, type p);
    void g(int);
    void h(void)
    {
        f(0, &(type)g);
    }
    
    // C++
    typedef void(*type)(void);
    
    type f();
    
    void g(type);
    
    void h()
    {
        g(&f());
    }
    
  • Zeichenfolgenliteral ist ein konstantes ArrayString literal is a constant array

    Der folgende Code erzeugt nun C2664: „void f(void )“: Argument 1 kann nicht von „const char ()[2]“ in „void *“ konvertiert werdenThe following code now produces C2664: 'void f(void )': cannot convert argument 1 from 'const char ()[2]' to 'void *'

    void f(void *);
    
    void h(void)
    {
        f(&__FUNCTION__);
        void *p = &"";
    }
    

    Zur Behebung des Fehlers müssen Sie den Funktionsparametertyp in const void* ändern oder den Text von h wie im folgenden Beispiel ändern:To fix the error, change the function parameter type to const void*, or else change the body of h to look like this example:

    void h(void)
    {
        char name[] = __FUNCTION__;
        f( name);
        void *p = &"";
    }
    
  • C++11-UDL-ZeichenfolgenC++11 UDL strings

    Der folgende Code erzeugt nun den Fehler C3688: ungültiges Literalsuffix „L“; Literaloperator oder Literaloperatorvorlage „operator ""L“ nicht gefundenThe following code now produces error C3688: invalid literal suffix 'L'; literal operator or literal operator template 'operator ""L' not found

    #define MACRO
    
    #define STRCAT(x, y) x\#\#y
    
    int main(){
    
        auto *val1 = L"string"MACRO;
        auto *val2 = L"hello "L"world";
    
        std::cout << STRCAT(L"hi ", L"there");
    }
    

    Diesen Fehler beheben Sie, indem Sie dem Code ein Leerzeichen hinzufügen:To fix the error, change the code to add a space:

    #define MACRO
    
    // Remove ##. Strings are automatically
    // concatenated so they aren't needed
    #define STRCAT(x, y) x y
    
    int main(){
        //Add space after closing quote
        auto *val1 = L"string" MACRO;
        auto *val2 = L"hello " L"world";
    
        std::cout << STRCAT(L"hi ", L"there");
    }
    

    Im Beispiel oben wird MACRO nicht mehr als zwei Token (eine Zeichenfolge gefolgt von einem Makro) analysiert.In the example above, MACRO is no longer parsed as two tokens (a string followed by a macro). Nun erfolgt die Analyse als einzelner Token-UDL.Now it's parsed as a single token UDL. Das Gleiche gilt für „L""L""“, was zuvor als „L""“ und „L""“ analysiert wurde und nun als „L""L“ und „""“ analysiert wird.The same applies to L""L"", which was parsed previously as L"" and L"", and is now parsed as L""L and "".

    Regeln für das Verketten von Zeichenfolgen stimmen nun auch mit dem Standard überein, was bedeutet, dass „L"a" "b"“ mit „L"ab"“ übereinstimmt.String concatenation rules were also brought into compliance with the standard, which means L"a" "b" is equivalent to L"ab". Frühere Versionen von Visual Studio haben die Verkettung von Zeichenfolgen mit unterschiedlicher Zeichenbreite nicht akzeptiert.Previous editions of Visual Studio did not accept concatenation of strings with different character width.

  • C++11: leeres Zeichen entferntC++11 empty character removed

    Der folgende Code erzeugt nun den Fehler C2137: leere ZeichenkonstanteThe following code now produces error C2137: empty character constant

    bool check(wchar_t c){
        return c == L''; //implicit null character
    }
    

    Ändern Sie zum Beheben des Fehlers den Code folgendermaßen, um die „0“ (null) explizit festzulegen:To fix the error, change the code to make the null explicit:

    bool check(wchar_t c){
        return c == L'\0';
    }
    
  • MFC-Ausnahmen können nicht nach Wert abgefangen werden, da sie nicht kopierbar sindMFC exceptions can't be caught by value because they aren't copyable

    Der folgende Code in einer MFC-Anwendung verursacht jetzt Fehler C2316: „D“: Kann nicht aufgefangen werden, da Destruktor und/oder copy-Konstruktor nicht verfügbar sind oder gelöscht wurdenThe following code in an MFC application now causes error C2316: 'D': cannot be caught as the destructor and/or copy constructor are inaccessible or deleted

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

    Zur Korrektur des Codes können Sie den „catch“-Block in catch (const D &) ändern, doch die bessere Lösung ist meist das Verwenden der MFC-Makros TRY/CATCH.To fix the code, you can change the catch block to catch (const D &) but the better solution is usually to use the MFC TRY/CATCH macros.

  • alignofist jetzt ein Schlüsselwortalignof is now a keyword

    Der folgende Code führt jetzt zu Fehler C2332: „class“: fehlender Tagname.The following code now produces error C2332: 'class': missing tag name. Um den Code zu korrigieren, müssen Sie die-Klasse umbenennen oder, wenn die Klasse dieselbe Arbeit wie ausführt alignof , einfach die-Klasse durch das New-Schlüsselwort ersetzen.To fix the code you must rename the class or, if the class is performing the same work as alignof, just replace the class with the new keyword.

    class alignof{}
    
  • constexprist jetzt ein Schlüsselwortconstexpr is now a keyword

    Mit dem folgenden Code wird nun Fehler C2059 generiert: Syntaxfehler: ')'.The following code now produces error C2059: syntax error: ')'. Um den Code zu korrigieren, müssen Sie alle Funktions-oder Variablennamen umbenennen, die aufgerufen werden constexpr .To fix the code, you must rename any function or variable names that are called constexpr.

    int constexpr() {return 1;}
    
  • Verschiebbare Typen dürfen nicht const seinMovable types can't be const

    Wenn eine Funktion einen Typ zurückgibt, der verschoben werden soll, sollte der Rückgabetyp nicht sein const .When a function returns a type that's intended to be moved, its return type should not be const.

  • Gelöschte KopierkonstruktorenDeleted copy constructors

    Der folgende Code erzeugt nun C2280: „S::S(S &&)“: Es wurde versucht, auf eine gelöschte Funktion zu verweisen:The following code now produces C2280 'S::S(S &&)': attempting to reference a deleted function:

    struct S{
        S(int, int);
        S(const S&) = delete;
        S(S&&) = delete;
    };
    
    S s2 = S(2, 3); //C2280
    

    Verwenden Sie für S2 direkte Initialisierung, um den Fehler zu beheben:To fix the error, use direct initialization for S2:

    struct S{
        S(int, int);
        S(const S&) = delete;
        S(S&&) = delete;
    };
    
    S s2 = {2,3}; //OK
    
  • Konvertierung in Funktionszeiger wird nur generiert, wenn kein Lambdaausdruck erfasst wirdConversion to function pointer only generated when no lambda capture

    Der folgende Code führt in Visual Studio 2015 zu C2664.The following code produces C2664 in Visual Studio 2015.

    void func(int(*)(int)) {}
    
    int main() {
    
        func([=](int val) { return val; });
    }
    

    Um den Fehler zu beheben, entfernen Sie = aus der Erfassungsliste.To fix the error, remove the = from the capture list.

  • Mehrdeutige Aufrufe im Zusammenhang mit KonvertierungsoperatorenAmbiguous calls involving conversion operators

    Der folgende Code erzeugt nun C2440: „Typumwandlung“: Konvertierung von „S2“ zu „S1“ nicht möglich:The following code now produces error C2440: 'type cast': cannot convert from 'S2' to 'S1':

    struct S1 {
        S1(int);
    };
    
    struct S2 {
        operator S1();
        operator int();
    };
    
    void f(S2 s2)
    {
        (S1)s2;
    }
    

    Um den Fehler zu beheben, müssen Sie den Konvertierungsoperator explizit aufrufen:To fix the error, explicitly call the conversion operator:

    void f(S2 s2)
    {
        //Explicitly call the conversion operator
        s2.operator S1();
        // Or
        S1((int)s2);
    }
    

    Der folgende Code erzeugt nun den Fehler C2593: „operator=“ ist mehrdeutig:The following code now produces error C2593: 'operator =' is ambiguous:

    struct S1 {};
    
    struct S2 {
        operator S1&();
        operator S1() const;
    };
    
    void f(S1 *p, S2 s)
    {
        *p = s;
    }
    

    Um den Fehler zu beheben, müssen Sie den Konvertierungsoperator explizit aufrufen:To fix the error, explicitly call the conversion operator:

    void f(S1 *p, S2 s)
    {
        *p = s.operator S1&();
    }
    
  • Korrigieren einer ungültigen Kopierinitialisierung in nicht statischer DatenmemberinitialisierungFix invalid copy initialization in non-static data member initialization (NSDMI)

    Der folgende Code erzeugt nun den Fehler C2664: „S1::S1(S1 &&)“: Konvertierung von Argument 1 von „bool“ zu „const S1 &“ nicht möglich:The following code now produces error C2664: 'S1::S1(S1 &&)': cannot convert argument 1 from 'bool' to 'const S1 &':

    struct S1 {
        explicit S1(bool);
    };
    
    struct S2 {
        S1 s2 = true; // error
    };
    

    Verwenden Sie direkte Initialisierung, um den Fehler zu korrigieren:To fix the error, use direct initialization:

    struct S2 {
    S1 s1{true}; // OK
    };
    
  • Zugreifen auf Konstruktoren in decltype-AnweisungenAccessing constructors inside decltype statements

    Der folgende Code erzeugt nun C2248: „S::S“: Zugriff auf in der Klasse „S“ deklarierten privaten Member nicht möglich:The following code now produces C2248: 'S::S': cannot access private member declared in class 'S':

    class S {
        S();
    public:
        int i;
    };
    
    class S2 {
        auto f() -> decltype(S().i);
    };
    

    Fügen Sie zur Behebung des Fehlers eine „friend“-Deklaration für S2 in S hinzu:To fix the error, add a friend declaration for S2 in S:

    class S {
        S();
        friend class S2; // Make S2 a friend
    public:
        int i;
    };
    
  • Standardkonstruktor von Lambdaausdrücken wird implizit gelöschtDefault ctor of lambda is implicitly deleted

    Der folgende Code erzeugt nun den Fehler C3497: Sie können keine Instanz eines Lambdaelements erstellen:The following code now produces error C3497: you cannot construct an instance of a lambda:

    void func(){
        auto lambda = [](){};
    
        decltype(lambda) other;
    }
    

    Um den Fehler zu beheben, entfernen Sie die Notwendigkeit des Aufrufs des Standardkonstruktors.To fix the error, remove the need for the default constructor to be called. Wenn das Lambda nichts erfasst, kann er in einen Funktionszeiger umgewandelt werden.If the lambda doesn't capture anything, then it can be cast to a function pointer.

  • Lambdaausdrücke mit einem gelöschten ZuweisungsoperatorLambdas with a deleted assignment operator

    Mit dem folgenden Code wird nun Fehler C2280 generiert:The following code now produces error C2280:

    #include <memory>
    #include <type_traits>
    
    template <typename T, typename D>
    std::unique_ptr<T, typename std::remove_reference<D &&>::type> wrap_unique(T *p, D &&d);
    
    void f(int i)
    {
        auto encodedMsg = wrap_unique<unsigned char>(nullptr, [i](unsigned char *p) {
        });
        encodedMsg = std::move(encodedMsg);
    }
    

    Um den Fehler zu beheben, ersetzen Sie den Lambda durch eine „functor“-Klasse, oder entfernen Sie die Notwendigkeit der Verwendung des Zuweisungsoperators.To fix the error, replace the lambda with a functor class or remove the need to use the assignment operator.

  • Verschieben eines Objekt mit einem gelöschten KopierkonstruktorAttempting to move an object with deleted copy constructor

    Der folgende Code erzeugt nun den Fehler C2280: „moveable::moveable(const moveable &)“: Versuch des Verweises auf eine gelöschte FunktionThe following code now produces error C2280: 'moveable::moveable(const moveable &)': attempting to reference a deleted function

    struct moveable {
    
        moveable() = default;
        moveable(moveable&&) = default;
        moveable(const moveable&) = delete;
    };
    
    struct S {
        S(moveable && m) :
            m_m(m)//copy constructor deleted
        {}
        moveable m_m;
    };
    

    Verwenden Sie zur Behebung des Fehlers stattdessen std::move:To fix the error, use std::move instead:

    S(moveable && m) :
        m_m(std::move(m))
    
  • Lokale Klasse kann nicht auf andere lokale Klasse verweisen, die später in derselben Funktion definiert istLocal class can't reference other local class defined later in the same function

    Der folgende Code erzeugt nun den Fehler C2079: „s“ verwendet die nicht definierte Struktur "main::S2"The following code now produces error C2079: 's' uses undefined struct 'main::S2'

    int main()
    {
        struct S2;
        struct S1 {
            void f() {
                S2 s;
            }
        };
        struct S2 {};
    }
    

    Verschieben Sie die Definition von S2 zur Behebung des Fehlers nach oben:To fix the error, move up the definition of S2:

    int main()
    {
        struct S2 { //moved up
        };
    
    struct S1 {
        void f() {
            S2 s;
            }
        };
    }
    
  • Basiskonstruktor mit protected-Zugriffsmodifizierer kann nicht im Körper eines abgeleiteten Konstruktors aufgerufen werdenCannot call a protected base ctor in the body of derived ctor.

    Der folgende Code erzeugt nun den Fehler C2248: „S1::S1“: Zugriff auf in der Klasse „S1“ deklarierten geschützten Member nicht möglichThe following code now produces error C2248: 'S1::S1': cannot access protected member declared in class 'S1'

    struct S1 {
    protected:
        S1();
    };
    
    struct S2 : public S1 {
        S2() {
            S1();
        }
    };
    

    Entfernen Sie zur Behebung des Fehlers in S2 den Aufruf von S1() aus dem Konstruktor, und verschieben Sie ihn bei Bedarf in eine andere Funktion.To fix the error, in S2 remove the call to S1() from the constructor and if necessary put it in another function.

  • {}verhindert Konvertierung in Zeiger{} prevents conversion to pointer

    Der folgende Code erzeugt nun C2439 „S::p“: Member konnte nicht initialisiert werdenThe following code now produces C2439 'S::p': member could not be initialized

    struct S {
        S() : p({ 0 }) {}
        void *p;
    };
    

    Um den Fehler zu beheben, entfernen Sie die geschweiften Klammern aus, 0 oder verwenden Sie nullptr stattdessen, wie im folgenden Beispiel gezeigt:To fix the error, remove the braces from around the 0 or else use nullptr instead, as shown in this example:

    struct S {
        S() : p(nullptr) {}
        void *p;
    };
    
  • Falsche Makrodefinition und -nutzung mit KlammernIncorrect macro definition and usage with parentheses

    Das folgende Beispiel erzeugt nun den Fehler C2008: ";": Unerwartetes Zeichen in MakrodefinitionThe following example now produces error C2008: ';': unexpected in macro definition

    #define A; //cause of error
    
    struct S {
        A(); // error
    };
    

    Ändern Sie zum Beheben des Problems die oberste Zeile in #define A();.To fix the problem, change the top line to #define A();

    Der folgende Code erzeugt nun den Fehler C2059: Syntaxfehler: „)“The following code produces error C2059: syntax error: ')'

    //notice the space after 'A'
    #define A () ;
    
    struct S {
        A();
    };
    

    Entfernen Sie das Leerzeichen zwischen A und (), um den Code zu korrigieren.To fix the code, remove the space between A and ().

    Der folgende Code erzeugt nun den Fehler C2091: Funktion gibt Funktion zurück:The following code produces error C2091: function returns function:

    #define DECLARE void f()
    
    struct S {
        DECLARE();
    };
    

    Um den Fehler zu beheben, entfernen Sie die Klammern nach DECLARE in S: DECLARE;.To fix the error, remove the parentheses after DECLARE in S: DECLARE;.

    Der folgende Code erzeugt nun den Fehler C2062: Typ „int“ wurde nicht erwartetThe following code produces error C2062: type 'int' unexpected

    #define A (int)
    
    struct S {
        A a;
    };
    

    Definieren Sie zur Behebung des Problems A wie folgt:To fix the problem, define A like this:

    #define A int
    
  • Zusätzliche Klammern in DeklarationenExtra parens in declarations

    Der folgende Code erzeugt nun den Fehler C2062: Typ „int“ wurde nicht erwartetThe following code produces error C2062: type 'int' unexpected

    struct S {
        int i;
        (int)j;
    };
    

    Entfernen Sie die Klammern um j, um den Fehler zu beheben.To fix the error, remove the parentheses around j. Wenn die Klammern aus Gründen der Übersichtlichkeit benötigt werden, verwenden Sie eine typedef .If the parentheses are needed for clarity, then use a typedef.

  • Vom Compiler generierte Konstruktoren und __declspec(novtable)Compiler-generated constructors and __declspec(novtable)

    In Visual Studio 2015 ist es wahrscheinlicher, dass vom Compiler generierte Inline-Konstruktoren von abstrakten Klassen mit virtuellen Basisklassen zu falscher Nutzung von __declspec(novtable) in Kombination mit __declspec(dllimport) führen.In Visual Studio 2015, there is an increased likelihood that compiler-generated inline constructors of abstract classes with virtual base classes may expose improper usage of __declspec(novtable) when used in combination with __declspec(dllimport).

  • auto erfordert einzelnen Ausdruck in direct-list-initializationauto requires single expression in direct-list-initialization

    Der folgende Code erzeugt nun Fehler C3518: "testPositions": In einem „direct-list-initialization“-Kontext kann der Typ für „auto“ nur aus einem einzelnen Initialisierungsausdruck hergeleitet werdenThe following code now produces error C3518: 'testPositions': in a direct-list-initialization context the type for 'auto' can only be deduced from a single initializer expression

    auto testPositions{
        std::tuple<int, int>{13, 33},
        std::tuple<int, int>{-23, -48},
        std::tuple<int, int>{38, -12},
        std::tuple<int, int>{-21, 17}
    };
    

    Eine Möglichkeit zur Behebung des Fehlers ist das Initialisieren von testPositions. Dabei wird wie folgt vorgegangen:To fix the error, one possibility is to initialize testPositions as follows:

    std::tuple<int, int> testPositions[]{
        std::tuple<int, int>{13, 33},
        std::tuple<int, int>{-23, -48},
        std::tuple<int, int>{38, -12},
        std::tuple<int, int>{-21, 17}
    };
    
  • Überprüfen von Typen und Verweisen auf Typen für is_convertibleChecking types vs. pointers to types for is_convertible

    Der folgende Code bewirkt nun, dass die statische Assertion fehlschlägt.The following code now causes the static assertion to fail.

    struct B1 {
    private:
        B1(const B1 &);
    };
    struct B2 : public B1 {};
    struct D : public B2 {};
    
    static_assert(std::is_convertible<D, B2>::value, "fail");
    

    Um den Fehler zu beheben, ändern static_assert Sie den, sodass Zeiger auf D und verglichen werden B2 :To fix the error, change the static_assert so that it compares pointers to D and B2:

    static_assert(std::is_convertible<D*, B2*>::value, "fail");
    
  • Deklarationen von __declspec(novtable) müssen einheitlich sein__declspec(novtable) declarations must be consistent

    __declspec Deklarationen müssen in allen Bibliotheken einheitlich sein.__declspec declarations must be consistent across all libraries. Der folgende Code erzeugt nun einen Verstoß gegen eine Regel mit einer Definition:The following code will now produce a one-definition rule (ODR) violation:

    //a.cpp
    class __declspec(dllexport)
        A {
    public:
        A();
        A(const A&);
        virtual ~A();
    private:
        int i;
    };
    
    A::A() {}
    A::~A() {}
    A::A(const A&) {}
    
    //b.cpp
    // compile with cl.exe /nologo /LD /EHsc /Osx b.cpp
    #pragma comment(lib, "A")
    class __declspec(dllimport) A
    {
    public: A();
            A(const A&);
            virtual ~A();
    private:
        int i;
    };
    
    struct __declspec(novtable) __declspec(dllexport) B
        : virtual public A {
        virtual void f() = 0;
    };
    
    //c.cpp
    #pragma comment(lib, "A")
    #pragma comment(lib, "B")
    class __declspec(dllimport) A
    {
    public:
        A();
        A(const A&);
        virtual ~A();
    private:
        int i;
    };
    struct  /* __declspec(novtable) */ __declspec(dllimport) B // Error. B needs to be novtable here also.
        : virtual public A
    {
        virtual void f() = 0;
    };
    
    struct C : virtual B
    {
        virtual void f();
    };
    
    void C::f() {}
    C c;
    

Verbesserungen bei der Übereinstimmung mit Standards in Update 1Conformance Improvements in Update 1

  • Private virtuelle Basisklassen und indirekte VererbungPrivate virtual base classes and indirect inheritance

    In früheren Versionen des Compilers war es abgeleiteten Klassen möglich, Memberfunktionen ihrer indirekt abgeleiteten private virtual-Basisklassen aufzurufen.Previous versions of the compiler allowed a derived class to call member functions of its indirectly derived private virtual base classes. Dieses alte Verhalten war falsch und entsprach nicht dem C++-Standard.This old behavior was incorrect and doesn't conform to the C++ standard. Der Compiler akzeptiert auf diese Weise erstellten Code nicht mehr und gibt dafür den Compilerfehler C2280 aus.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
    

    Beispiel (vorher)Example (before)

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

    Beispiel (nachher)Example (after)

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

    - oder –- or -

    class base;  // as above
    
    class middle : private virtual base {};
    class top : public virtual middle, private virtual bottom {};
    
    void destroy(top *p)
    {
        delete p;
    }
    
  • Überladener Operator „new“ und „delete“Overloaded operator new and operator delete

    In früheren Versionen des Compilers konnte ein new-Platzierungsoperator, der kein Member war, und ein delete-Platzierungsoperator, der kein Member war, statisch deklariert werden und in anderen Namespaces als dem globalen deklariert werden.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. Dieses alte Verhalten hat das Risiko verursacht, dass das Programm nicht die new Implementierung des Operators oder des delete Operators aufruft, die der Programmierer beabsichtigt hat, was zu einem stillen ungültigen Laufzeitverhalten führt.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. Der Compiler akzeptiert in dieser Weise erstellten Code nicht mehr und gibt den Compilerfehler C2323 als Ergebnis aus.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.
    

    Beispiel (vorher)Example (before)

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

    Beispiel (nachher)Example (after)

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

    Außerdem wird der Inline Operator als falsch formatiert betrachtet, obwohl der Compiler keine bestimmte Diagnose hat new .Additionally, although the compiler doesn't give a specific diagnostic, inline operator new is considered ill-formed.

  • Aufrufen von ' Operator Type() ' (benutzerdefinierte Konvertierung) für nicht KlassentypenCalling 'operator type()' (user-defined conversion) on non-class types

    Frühere Versionen ließen den Aufruf von 'operator type()' für Nichtklassentypen zu und ignorierten den Aufruf stumm.Previous versions of the compiler allowed 'operator type()' to be called on non-class types while silently ignoring it. Durch dieses alte Verhalten entstand die Gefahr der stummen Erzeugung von ungültigem Code, was zu unvorhersehbarem Laufzeitverhalten führt.This old behavior created a risk of silent bad code generation, resulting in unpredictable runtime behavior. Der Compiler akzeptiert in dieser Weise erstellten Code nicht mehr und gibt den Compilerfehler C2228 als Ergebnis aus.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
    

    Beispiel (vorher)Example (before)

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

    Beispiel (nachher)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'
    }
    
  • Redundanter Typname in ausführlichen TypspezifizierernRedundant typename in elaborated type specifiers

    Frühere Versionen des Compilers typename waren in einem ausführlichen Typspezifizierer zulässig, aber auf diese Weise geschriebene Code ist semantisch falsch.Previous versions of the compiler allowed typename in an elaborated type specifier, but code written in this way is semantically incorrect. Der Compiler akzeptiert in dieser Weise erstellten Code nicht mehr und gibt den Compilerfehler C3406 als Ergebnis aus.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
    

    Beispiel (vorher)Example (before)

    template <typename class T>
    class container;
    

    Beispiel (nachher)Example (after)

    template <class T>  // alternatively, could be 'template <typename T>'; 'typename' is not elaborating a type specifier in this case
    class container;
    
  • Typableitung von Arrays aus einer InitialisiererlisteType deduction of arrays from an initializer list

    In früheren Versionen des Compilers wurde die Typableitung von Arrays aus einer Initialisiererliste nicht unterstützt.Previous versions of the compiler did not support type deduction of arrays from an initializer list. Der Compiler unterstützt jetzt diese Form der Typableitung. Das kann zur Folge haben, dass Aufrufe an Funktionsvorlagen mithilfe von Initialisiererlisten jetzt möglicherweise nicht mehr eindeutig sind, oder es wird eine andere Überladung gewählt als in früheren Versionen des Compilers.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. Um diese Probleme zu beheben, muss das Programm jetzt die vom Programmierer beabsichtigte Überladung explizit angeben.To resolve these issues, the program must now explicitly specify the overload that the programmer intended.

    Wenn dieses neue Verhalten bewirkt, dass ein anderer Kandidat bei der Überladungsauflösung als ebenso gut wie der historische Kandidat angesehen wird, wird der Aufruf mehrdeutig, und der Compiler gibt den Compilerfehler C2668 als Ergebnis aus.When this new behavior causes overload resolution to consider an additional candidate that's 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.
    

    Beispiel 1: Mehrdeutiger Aufruf einer überladenen Funktion (vorher)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
    }
    

    Beispiel 1: Mehrdeutiger Aufruf einer überladenen Funktion (nachher)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);
    }
    

    Wenn dieses neue Verhalten bewirkt, dass ein anderer Kandidat bei der Überladungsauflösung als bessere Übereinstimmung als der historische Kandidat angesehen wird, wird der Aufruf eindeutig zum neuen Kandidaten aufgelöst, was eine Änderung im Verhalten des Programms bewirkt, die vermutlich von den Absichten des Programmierers abweicht.When this new behavior causes overload resolution to consider an additional candidate that's a better match than the historic candidate, the call resolves unambiguously to the new candidate, causing a change in program behavior that's probably different than the programmer intended.

    Beispiel 2: Änderung an der Überladungsauflösung (vorher)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 });
    }
    

    Beispiel 2: Änderung an der Überladungsauflösung (nachher)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 });
    }
    
  • Wiederherstellung von Warnungen der switch-AnweisungRestoration of switch statement warnings

    Eine frühere Version des Compilers hat einige Warnungen im Zusammenhang mit- switch Anweisungen entfernt; diese Warnungen wurden jetzt wieder hergestellt.A previous version of the compiler removed some warnings related to switch statements; these warnings have now been restored. Der Compiler gibt jetzt die wiederhergestellten Warnungen aus, und Warnungen, die sich auf bestimmte Fälle (einschließlich des Standardfalls) bezogen, werden jetzt in der Zeile ausgegeben, die den Verstoß enthält, statt in der letzten Zeile der switch-Anweisung.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. Die Ausgabe dieser Warnungen in anderen Zeilen als bisher kann zur Folge haben, dass Warnungen, die früher mithilfe von #pragma warning(disable:####) unterdrückt wurden, möglicherweise nicht mehr wie beabsichtigt unterdrückt werden.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. Möglicherweise ist erforderlich, dass Sie die #pragma warning(disable:####)-Anweisung in eine Zeile oberhalb des ersten Verstoßes verschieben, um diese Warnungen wie beabsichtigt zu unterdrücken.To suppress these warnings as intended, it might be necessary to move the #pragma warning(disable:####) directive to a line above the first offending case. Im Folgenden werden die wiederhergestellten Warnungen aufgeführt: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
    

    Beispiel für C4063 (vorher)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;
        }
    };
    

    Beispiel für C4063 (nachher)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;
        }
    };
    

    Beispiele für die anderen wiederhergestellten Warnungen stehen in deren Dokumentation zur Verfügung.Examples of the other restored warnings are provided in their documentation.

  • #include: Verwendung des Bezeichners '..' für das übergeordnete Verzeichnis im Pfadnamen (betrifft nur /Wall /WX)#include: use of parent-directory specifier '..' in pathname (only affects /Wall /WX)

    Frühere Versionen des Compilers haben die Verwendung des Bezeichners '..'Previous versions of the compiler did not detect the use of the parent-directory specifier '..' für das übergeordnete Verzeichnis im Pfadnamen von #include-Anweisungen nicht erkannt.in the pathname of #include directives. Bei in dieser Weise erstelltem Code wird normalerweise die Absicht verfolgt, Header einzuschließen, die sich außerhalb des Projekts befinden, und dazu werden fälschlicherweise projektrelative Pfade verwendet.Code written in this way is usually intended to include headers that exist outside of the project by incorrectly using project-relative paths. Bei diesem alten Verhalten ergab sich die Gefahr, dass das Programm möglicherweise mit Einschluss einer anderen als der vom Programmierer beabsichtigten Quelldatei compiliert wurde oder dass diese relativen Pfade nicht auf andere Buildumgebungen portiert werden konnten.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. Der Compiler erkennt jetzt in dieser Weise erstellten Code und benachrichtigt den Programmierer mit der optionalen Compilerwarnung C4464, sofern diese aktiviert ist.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 '..'
    

    Beispiel (vorher)Example (before)

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

    Beispiel (nachher)Example (after)

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

    Darüber hinaus wird empfohlen, den Bezeichner „..“ für das übergeordnete Verzeichnis nicht zum Festlegen der Includeverzeichnisse des Projekts zu verwenden, obwohl der Compiler keine spezifische Diagnose meldet.Additionally, although the compiler doesn't give a specific diagnostic, we also recommend that the parent-directory specifier ".." shouldn't be used to specify your project's include directories.

  • #pragma optimize() erstreckt sich über das Ende der Headerdatei hinaus (betrifft nur /Wall /WX)#pragma optimize() extends past end of header file (only affects /Wall /WX)

    In früheren Versionen wurden Änderungen an den Optimierungseinstellungen nicht erkannt, die zum Escapen einer in einer Übersetzungseinheit eingeschlossenen Headerddatei dienen.Previous versions of the compiler did not detect changes to optimization flag settings that escape a header file included within a translation unit. Der Compiler erkennt jetzt in dieser Weise erstellten Code und setzt den Programmierer mit der optionalen Compilerwarnung C4426 von der Position des #include-Verstoßes in Kenntnis, sofern diese aktiviert ist.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. Diese Warnung wird nur ausgegeben, wenn die Änderungen im Konflikt mit den Optimierungseinstellungen stehen, die durch die Befehlszeilenargumente für den Compiler festgelegt wurden.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()
    

    Beispiel (vorher)Example (before)

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

    Beispiel (nachher)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"
    
  • Nicht übereinstimmende Festlegung von „#pragma warning(push)“ und #pragma warning(pop) (betrifft nur /Wall /WX)Mismatched #pragma warning(push) and #pragma warning(pop) (only affects /Wall /WX)

    Frühere Versionen des Compilers konnten keine #pragma warning(push)-Statusänderungen erkennen, die in Kombination mit #pragma warning(pop)-Statusänderungen in einer anderen Quelldatei auftraten, was selten beabsichtigt ist.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. Dieses alte Verhalten brachte die Gefahr mit sich, dass das Programm mit anderen Warnungseinstellungen als den vom Programmierer vorgesehenen kompiliert wurde, was möglicherweise zu einem schlechten Laufzeitverhalten führt.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. Der Compiler erkennt jetzt auf diese Weise erstellten Code und setzt den Programmierer mit der optionalen Compilerwarnung C5031 von der Position der #pragma warning(pop)-Übereinstimmung in Kenntnis, sofern diese aktiviert ist.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. Diese Warnung enthält einen Hinweis, der auf den Speicherort der entsprechenden „#pragma warning(push)“ verweist.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
    

    Beispiel (vorher)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
    ...
    

    Beispiel (nachher)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"
    ...
    

    Wenngleich ungewöhnlich, wird Code mitunter absichtlich auf diese Weise geschrieben.Though uncommon, code written in this way is sometimes intentional. Auf diese Weise erstellter Code ist empfindlich gegenüber Änderungen an der #include-Reihenfolge. Wir empfehlen, dass Quellcodedateien den Warnungsstatus nach Möglichkeit eigenständig verwalten sollten.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.

  • Nicht zugeordnete „#pragma warning“ (push) (betrifft nur /Wall /WX)Unmatched #pragma warning(push) (only affects /Wall /WX)

    Frühere Versionen des Compilers haben nicht zugeordnete #pragma warning(push) -Statusänderungen am Ende einer Übersetzungseinheit nicht erkannt.Previous versions of the compiler did not detect unmatched #pragma warning(push) state changes at the end of a translation unit. Der Compiler erkennt jetzt auf diese Weise erstellten Code und informiert den Programmierer mit der optionalen Compilerwarnung C5032 über die Position der fehlenden #pragma warning(push)-Übereinstimmung, sofern diese aktiviert ist.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. Diese Warnung wird nur ausgegeben, wenn in der Übersetzungseinheit keine Kompilierfehler auftreten.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)
    

    Beispiel (vorher)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
    

    Beispiel (nachher)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)
    
  • Möglicherweise werden weitere Warnungen als Folge der verbesserten Statusnachverfolgung bei „#pragma warning“ angezeigtAdditional warnings might be issued as a result of improved #pragma warning state tracking

    In früheren Versionen des Compilers wurden Statusänderungen bei „#pragma warning“ nicht hinreichend gut nachverfolgt, um alle beabsichtigten Warnungen auszugeben.Previous versions of the compiler tracked #pragma warning state changes insufficiently well to issue all intended warnings. Durch dieses Verhalten bestand die Gefahr, dass bestimmte Warnungen unter anderen als den vom Programmierer beabsichtigten Umständen effektiv unterdrückt wurden.This behavior created a risk that certain warnings would be effectively suppressed in circumstances different than the programmer intended. Die Nachverfolgung des Status von #pragma warning erfolgt nun auf stabilere Weise – insbesondere im Zusammenhang mit #pragma warning-Statusänderungen in Vorlagen – und gibt optional die neuen Warnungen C5031 und C5032 aus, die den Programmierer bei der Suche nach unbeabsichtigter Verwendung von #pragma warning(push) und #pragma warning(pop) unterstützen sollen.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).

    Als Ergebnis der verbesserten Nachverfolgung des Status von #pragma warning können jetzt Warnungen ausgegeben werden, die früher fälschlicherweise unterdrückt wurden oder mit falsch identifizierten Problemen zusammenhingen.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.

  • Verbesserte Erkennung von unerreichbarem CodeImproved identification of unreachable code

    Änderungen an der C++-Standardbibliothek und eine im Vergleich mit früheren Versionen des Compilers verbesserte Möglichkeit zur Inlineausführung von Funktionsaufrufen ermöglichen dem Compiler jetzt unter Umständen den Nachweis, dass bestimmter Code unerreichbar ist.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. Dieses neue Verhalten kann zu neuen und häufiger ausgegebenen Instanzen von Warnung C4720 führen.This new behavior can result in new and more-frequently issued instances of warning C4720.

    warning C4720: unreachable code
    

    In vielen Fällen wird diese Warnung nur beim Kompilieren mit aktivierten Optimierungen ausgegeben, da bei den Optimierungen mehr Funktionsaufrufe inline erfolgen, redundanter Code eliminiert wird oder auf andere Weise die Möglichkeit geschaffen wird, bestimmten Code als unerreichbar zu erkennen.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. Wir haben festgestellt, dass neue Instanzen von Warning C4720 häufig in try/catch- Blöcken aufgetreten sind, insbesondere in Bezug auf die Verwendung von Std:: Find.We have observed that new instances of warning C4720 have frequently occurred in try/catch blocks, especially in relation to use of std::find.

    Beispiel (vorher)Example (before)

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

    Beispiel (nachher)Example (after)

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

Verbesserungen der Konformität in Update 2Conformance Improvements in Update 2

  • Zusätzliche Warnungen und Fehler können als Ergebnis der Teilunterstützung für den Ausdruck SFINAE ausgegeben werdenAdditional warnings and errors might be issued as a result of partial support for expression SFINAE

    Frühere Versionen des Compilers haben bestimmte Arten von Ausdrücken innerhalb von Bezeichners nicht analysiert decltype , weil der Ausdruck sfinae nicht unterstützt wird.Previous versions of the compiler did not parse certain kinds of expressions inside decltype specifiers due to lack of support for expression SFINAE. Dieses alte Verhalten war falsch und entsprach nicht dem C++-Standard.This old behavior was incorrect and doesn't conform to the C++ standard. Der Compiler analysiert diese Ausdrücke jetzt und hat aufgrund kontinuierlicher Konformitätsverbesserungen eine Teilunterstützung für den Ausdruck SFINAE.The compiler now parses these expressions and has partial support for expression SFINAE due to ongoing conformance improvements. Daher gibt der Compiler jetzt Warnungen und Fehler aus, die er in Ausdrücken findet, die von früheren Versionen des Compilers nicht analysiert werden.As a result, the compiler now issues warnings and errors found in expressions that previous versions of the compiler did not parse.

    Wenn dieses neue Verhalten einen- decltype Ausdruck analysiert, der einen Typ enthält, der noch nicht deklariert wurde, gibt der Compiler den Compilerfehler C2039 als Ergebnis aus.When this new behavior parses a decltype expression that includes a type that hasn't been declared yet, the compiler issues compiler error C2039 as a result.

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

    Beispiel 1: Verwendung eines nicht deklarierten Typs (vorher)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 {};
    }
    

    Beispiel 1 (nachher)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 {};
    }
    

    Wenn dieses neue Verhalten einen- decltype Ausdruck analysiert, dem eine erforderliche Verwendung des- typename Schlüssel Worts fehlt, um anzugeben, dass ein abhängiger Name ein-Typ ist, gibt der Compiler die Compilerwarnung C4346 in Verbindung mit dem Compilerfehler C2923 aus.When this new behavior parses a decltype expression that's 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'
    

    Beispiel 2: der abhängige Name ist kein Typ (vorher)Example 2: dependent name isn't 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
    };
    

    Beispiel 2 (nachher)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****Member-Variablen verhindern implizit definierte Konstruktoren und Zuweisungs Operatorenvolatile member variables prevent implicitly defined constructors and assignment operators

    Frühere Versionen des Compilers ermöglichten, dass eine Klasse mit Element volatile Variablen standardmäßige Kopier-/bewegungskonstruktoren und standardmäßige Kopier-/verschiebezuweisungsoperatoren automatisch generiert werden.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. Dieses alte Verhalten war falsch und entsprach nicht dem C++-Standard.This old behavior was incorrect and doesn't conform to the C++ standard. Der Compiler betrachtet nun eine Klasse mit Element volatile Variablen, die nicht triviale Konstruktions-und Zuweisungs Operatoren aufweisen, wodurch verhindert wird, dass Standard Implementierungen dieser Operatoren automatisch generiert werden.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. Ist eine solche Klasse ein Member einer Union (oder einer anonymen Union innerhalb einer Klasse), werden Kopier-/Bewegungskonstruktoren und Kopier-/Bewegungszuweisungsoperatoren der Union (oder die Klasse, die die anonyme Union enthält) implizit als gelöscht definiert.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 anonymous union) will be implicitly defined as deleted. Wird versucht, die Union (oder die Klasse, die die anonyme Union enthält) zu erstellen oder zu kopieren, ohne sie explizit zu definieren, tritt ein Fehler auf, und der Compiler gibt daher den Compilerfehler C2280 aus.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
    

    Beispiel (vorher)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
    

    Beispiel (nachher)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
    
  • Statische Memberfunktionen unterstützen keine cv-QualifiziererStatic member functions do not support cv-qualifiers.

    In früheren Versionen von Visual Studio 2015 ist es zulässig, dass statische Memberfunktionen CV-Qualifizierer haben.Previous versions of Visual Studio 2015 allowed static member functions to have cv-qualifiers. Diese Verhalten wird von einer Regression in Visual Studio 2015 und Visual Studio 2015 Update 1 verursacht. Visual Studio 2013 sowie vorherige Versionen des Compilers lehnen Code, der auf diese Weise geschrieben ist, ab.This behavior is due to a regression in Visual Studio 2015 and Visual Studio 2015 Update 1; Visual Studio 2013 and previous versions of the compiler reject code written in this way. Das Verhalten von Visual Studio 2015 und Visual Studio 2015 Update 1 ist fehlerhaft und entspricht nicht dem C++-Standard.The behavior of Visual Studio 2015 and Visual Studio 2015 Update 1 is incorrect and doesn't conform to the C++ standard. Visual Studio 2015 Update 2 weist Code, der in dieser Weise geschrieben ist, zurück und gibt stattdessen den Compilerfehler C2511 aus.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'
    

    Beispiel (vorher)Example (before)

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

    Beispiel (nachher)Example(after)

    struct A
    {
        static void func();
    };
    
    void A::func() {}  // removed const
    
  • Vorwärtsdeklarationen einer Enumeration sind in WinRT-Code nicht zulässig (betrifft nur /ZW)Forward declaration of enum is not allowed in WinRT code (only affects /ZW)

    Code, der für die Windows-Runtime (WinRT) kompiliert enum wurde, lässt nicht zu, dass Typen als deklariert werden, ähnlich wie bei der Kompilierung von verwaltetem C++-Code für .NET Framework mit dem /clr Compilerschalter.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. Dieses Verhalten stellt sicher, dass die Größe einer Enumeration immer bekannt ist und richtig in das WinRT-Typsystem übertragen werden kann.This behavior ensures that the size of an enumeration is always known and can be correctly projected to the WinRT type system. Der Compiler lehnt in dieser Weise geschriebenen Code ab und gibt den Compilerfehler C2599 zusammen mit dem Compilerfehler C3197 aus.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
    

    Beispiel (vorher)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;
        }
    };
    

    Beispiel (nachher)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- oder delete-Funktionen eines überladenen Nicht-Memberoperators dürfen nicht inline deklariert werden (Level 1 (/W1) standardmäßig aktiviert)Overloaded non-member operator new and operator delete may not be declared inline (Level 1 (/W1) on-by-default)

    Frühere Versionen des Compilers geben keine Warnung aus, wenn new- oder delete-Funktionen eines Nicht-Memberoperators inline deklariert werden.Previous versions of the compiler do not issue a warning when non-member operator new and operator delete functions are declared inline. In dieser Weise geschriebener Code ist nicht wohlgeformt (keine Diagnose erforderlich) und kann zu Arbeitsspeicherproblemen führen, die sich aus nicht zusammengehörigen new- und delete-Operatoren ergeben (insbesondere bei Verwendung von Zuordnungsaufhebung mit Größenangabe), die sich nur schwer diagnostizieren lassen.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. Der Compiler gibt jetzt die Warnung C4595 aus, um Code erkennen zu können, der in dieser Weise geschrieben ist.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
    

    Beispiel (vorher)Example (before)

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

    Beispiel (nachher)Example (after)

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

    Ein Korrigieren von Code, der in dieser Weise geschrieben ist, kann erfordern, dass die Operatordefinitionen aus einer Headerdatei in eine entsprechende Quelldatei verschoben werden.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.

Verbesserungen bei der Übereinstimmung mit Standards in Update 3Conformance Improvements in Update 3

  • std::is_convertable erkennt jetzt Selbstzuweisung (Standardbibliothek)std::is_convertable now detects self-assignment (standard library)

    Frühere Versionen des Typmerkmals std::is_convertable erkannten die Selbstzuweisung eines Klassentyps nicht ordnungsgemäß, wenn der Kopierkonstruktor gelöscht wurde oder privat war.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. Nun std::is_convertable<>::value ist ordnungsgemäß auf festgelegt, false Wenn Sie auf einen Klassentyp mit einem gelöschten oder privaten Kopierkonstruktor angewendet wird.Now, std::is_convertable<>::value is correctly set to false when applied to a class type with a deleted or private copy constructor.

    Dieser Änderung ist keine Compilerdiagnose zugeordnet.There is no compiler diagnostic associated with this change.

    BeispielExample

    #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");
    

    In früheren Versionen des Compilers wurden die statischen Assertionen unten in diesem Beispiel übergeben, da std::is_convertable<>::value fälschlicherweise auf festgelegt wurde true .In previous versions of the compiler, the static assertions at the bottom of this example pass because std::is_convertable<>::value was incorrectly set to true. Nun std::is_convertable<>::value ist richtig auf festgelegt false , sodass die statischen Assertionen fehlschlagen.Now, std::is_convertable<>::value is correctly set to false, causing the static assertions to fail.

  • Standardmäßig verwendete und gelöschte triviale Kopier- und Verschiebekonstruktoren beachten ZugriffsspezifiziererDefaulted or deleted trivial copy and move constructors respect access specifiers

    In früheren Versionen des Compilers wurden die Zugriffsspezifizierer von als Standard festgelegten und gelöschten trivialen Kopier- und Verschiebekonstruktoren nicht geprüft, ehe ihr Aufrufen erlaubt wurde.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. Dieses alte Verhalten war falsch und entsprach nicht dem C++-Standard.This old behavior was incorrect and doesn't conform to the C++ standard. Durch dieses alte Verhalten entstand in einigen Fällen die Gefahr der stummen Erzeugung von ungültigem Code, was zu unvorhersehbarem Laufzeitverhalten führt.In some cases, this old behavior created a risk of silent bad code generation, resulting in unpredictable runtime behavior. Der Compiler prüft jetzt den Zugriffsspezifizierer von als Standard festgelegten und gelöschten trivialen Kopier- und Verschiebekonstruktoren, um zu bestimmen, ob diese aufgerufen werden können. Falls nicht, gibt der Compiler die Warnung C2248 aus.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'
    

    Beispiel (vorher)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
    }
    

    Beispiel (nachher)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);
    }
    
  • Attributierter ATL-Code veraltet (Level 1 (/W1) standardmäßig EIN)Deprecation of attributed ATL code support (Level 1 (/W1) on-by-default)

    Frühere Versionen des Compilers haben attributierten ATL-Code unterstützt.Previous versions of the compiler supported attributed ATL code. In der nächsten Phase der Aufhebung der Unterstützung von attributiertem ATL-Code, die in Visual Studio 2008 begann, gilt attributierter ATL-Code nun als veraltet.As the next phase of removing support for attributed ATL code that began in Visual Studio 2008, attributed ATL code has been deprecated. Der Compiler gibt jetzt die Warnung C4467 aus, um diese Art von veraltetem Code erkennen zu können.The compiler now issues compiler warning C4467 to help identify this kind of deprecated code.

    warning C4467: Usage of ATL attributes is deprecated
    

    Wenn Sie attributierten ATL-Code bis zur Aufhebung der Unterstützung durch den Compiler weiter nutzen möchten, können Sie diese Warnung deaktivieren, indem Sie das Befehlszeilenargument /Wv:18 oder /wd:4467 an den Compiler übergeben oder #pragma warning(disable:4467) zu Ihrem Quellcode hinzufügen.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 /wd:4467 command-line arguments to the compiler, or by adding #pragma warning(disable:4467) in your source code.

    Beispiel 1 (vorher)Example 1 (before)

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

    Beispiel 1 (nachher)Example 1 (after)

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

    Mitunter müssen oder möchten Sie ggf. eine IDL-Datei erstellen, um die Nutzung veralteter ATL-Attribute zu vermeiden (siehe den folgenden Beispielcode).Sometimes you might need or want to create an IDL file to avoid the use deprecated ATL attributes, as in the example code below

    Beispiel 2 (vorher)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
    {
        // ...
    };
    

    Erstellen Sie zunächst die *idl-Datei. Die generierte Datei vc140.idl kann zum Abrufen einer *.idl-Datei verwendet werden, die die Schnittstellen und Anmerkungen enthält.First, create the *.idl file; the vc140.idl generated file can be used to obtain an *.idl file containing the interfaces and annotations.

    Fügen Sie als Nächstes Ihrem Build einen MIDL-Schritt hinzu, um sicherzustellen, dass die C++-Schnittstellendefinitionen generiert werden.Next, add a MIDL step to your build to make sure that the C++ interface definitions are generated.

    Beispiel 2: IDL (nachher)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;
    };
    }
    

    Verwenden Sie dann ATL direkt in der Implementierungsdatei (siehe den folgenden Beispielcode).Then, use ATL directly in the implementation file, as in the example code below.

    Beispiel 2: Implementierung (nachher)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()
    };
    
  • Vorkompilierte Headerdateien (PCH) und nicht übereinstimmende #include-Anweisungen (wirkt sich nur auf /Wall /WX aus)Precompiled header (PCH) files and mismatched #include directives (only affects /Wall /WX)

    Frühere Version des Compilers haben bei Verwendung vorkompilierter Headerdateien (PCH) nicht übereinstimmende #include-Direktiven in Quelldateien zwischen -Yc- und -Yu-Kompilierungen akzeptiert.Previous versions of the compiler accepted mismatched #include directives in source files between -Yc and -Yu compilations when using precompiled header (PCH) files. Auf diese Weise geschriebener Code wird vom Compiler nicht mehr akzeptiert.Code written in this way is no longer accepted by the compiler. Der Compiler gibt nun die Compilerwarnung CC4598 aus, um bei Verwenden von PCH-Dateien nicht übereinstimmende #include-Direktiven zu bestimmen.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
    

    Beispiel (vorher):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"
    

    Beispiel (nachher)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"
    
  • Vorkompilierte Headerdateien (PCH) und nicht übereinstimmende include-Anweisungen (wirkt sich nur auf /Wall /WX aus)Precompiled header (PCH) files and mismatched include directories (only affects /Wall /WX)

    Frühere Version des Compilers haben bei Verwendung vorkompilierter Headerdateien (PCH) nicht übereinstimmende Befehlszeilenargumente des Typs „include directory“ (-I) für den Compiler zwischen -Yc- und -Yu-Kompilierungen akzeptiert.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. Auf diese Weise geschriebener Code wird vom Compiler nicht mehr akzeptiert.Code written in this way is no longer accepted by the compiler. Der Compiler gibt nun die Compilerwarnung CC4599 aus, um bei Verwenden von PCH-Dateien nicht übereinstimmende Befehlszeilenargumente des Typs „include-Verzeichnis“ (-I) zu bestimmen.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
    

    Beispiel (vorher)Example (before)

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

    Beispiel (nachher)Example (after)

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

Visual Studio 2013: Änderungen bei der Konformität mit StandardsVisual Studio 2013 Conformance Changes

CompilerCompiler

  • Das Schlüsselwort Final generiert nun einen nicht aufgelösten symbolfehler, wenn es zuvor kompiliert worden wäre:The final keyword now generates an unresolved symbol error where it would have compiled previously:

    struct S1 {
        virtual void f() = 0;
    };
    
    struct S2 final : public S1 {
        virtual void f();
    };
    
    int main(S2 *p)
    {
        p->f();
    }
    

    In früheren Versionen wurde ein Fehler nicht ausgegeben, weil der-Befehl ein-Rückruf war virtual . das Programm würde jedoch zur Laufzeit abstürzen.In earlier versions, an error wasn't issued because the call was a virtual call; nevertheless, the program would crash at runtime. Jetzt wird ein Linkerfehler ausgegeben, da die Klasse endgültig ist.Now, a linker error is issued because the class is known to be final. In diesem Beispiel kann das Objekt, das die Definition von S2::f enthält, verknüpft werden, um den Fehler zu beheben.In this example, to fix the error, you would link against the obj that contains the definition of S2::f.

  • Wenn Sie Friend-Funktionen in Namespaces verwenden, müssen Sie die Friend-Funktion erneut deklarieren, bevor Sie auf sie verweisen. Andernfalls wird ein Fehler ausgegeben, da der Compiler jetzt dem C++-Standard der internationalen Organisation für Normung entspricht.When you use friend functions in namespaces, you must redeclare the friend function before you refer to it or you will get an error because the compiler now conforms to the ISO C++ Standard. Beispielsweise wird das folgende Beispiel nicht mehr kompiliert:For example, this example no longer compiles:

    namespace NS {
        class C {
            void func(int);
            friend void func(C* const) {}
        };
    
        void C::func(int) {
            NS::func(this);  // error
        }
    }
    

    Um diesen Code zu korrigieren, deklarieren Sie die friend Funktion:To correct this code, declare the friend function:

    namespace NS {
        class C {
            void func(int);
            friend void func(C* const) {}
        };
    
        void func(C* const);  // conforming fix
    
        void C::func(int) {
            NS::func(this);
        }
    
  • Der C++-Standard lässt keine explizite Spezialisierung in einer Klasse zu.The C++ Standard doesn't allow explicit specialization in a class. Obwohl der Microsoft C++-Compiler dies in manchen Fällen zulässt, wird im folgenden Beispiel jedoch ein Fehler generiert, da der Compiler die zweite Funktion nicht als Spezialisierung der ersten betrachtet.Although the Microsoft C++ compiler allows it in some cases, in cases such as the following example, an error is now generated because the compiler doesn't consider the second function to be a specialization of the first one.

    template < int N>
    class S {
    public:
        template  void f(T& val);
        template < > void f(char val);
    };
    
    template class S< 1>;
    

    Um diesen Code zu korrigieren, ändern Sie die zweite Funktion:To correct this code, modify the second function:

    template <> void f(char& val);
    
  • Im folgenden Beispiel können die beiden Funktionen mit dem Compiler nicht mehr unterschieden werden, und es wird jetzt ein Fehler ausgegeben:The compiler no longer tries to disambiguate the two functions in the following example, and now emits an error:

    template< typename T> void Func(T* t = nullptr);
    template< typename T> void Func(...);
    
    int main() {
        Func< int>(); // error
    }
    

    Um diesen Code zu korrigieren, müssen Sie den Aufruf verdeutlichen:To correct this code, clarify the call:

    template< typename T> void Func(T* t = nullptr);
    template< typename T> void Func(...);
    
    int main() {
        Func< int>(nullptr); // ok
    }
    
  • Bevor der Compiler mit ISO c++ 11 kompatibel gemacht wurde, wurde der folgende Code kompiliert und führte dazu, dass x in den Typ aufgelöst wurde int :Before the compiler was made compliant with ISO C++11, the following code would have compiled and caused x to resolve to type int:

    auto x = {0};
    int y = x;
    

    Dieser Code wird nun x in einen Typ von aufgelöst std::initializer_list<int> und verursacht einen Fehler in der nächsten Zeile, die versucht, dem x Typ zuzuweisen int .This code now resolves x to a type of std::initializer_list<int> and causes an error on the next line that tries to assign x to type int. (Standardmäßig ist keine Konvertierung vorhanden.) Um diesen Code zu korrigieren, verwenden Sie, um Folgendes zu int ersetzen auto :(There is no conversion by default.) To correct this code, use int to replace auto:

    int x = {0};
    int y = x;
    
  • Die Aggregatinitialisierung ist nicht mehr zulässig, wenn der Typ des rechten Werts nicht dem Typ des linken Werts entspricht, der initialisiert wird, und es wird ein Fehler ausgegeben, da der ISO C++11-Standard erfordert, dass die einheitliche Initialisierung ohne einschränkende Konvertierungen funktioniert.Aggregate initialization is no longer allowed when the type of the right-hand value doesn't match the type of the left-hand value that's being initialized, and an error is issued because the ISO C++11 Standard requires uniform initialization to work without narrowing conversions. Bisher wurde die Compilerwarnung C4242 (Level 4) anstelle eines Fehlers ausgegeben, wenn eine einschränkende Konvertierung verfügbar war.Previously, if a narrowing conversion was available, a Compiler Warning (level 4) C4242 warning would have been issued instead of an error.

    int i = 0;
    char c = {i}; // error
    

    Um diesen Code zu korrigieren, fügen Sie eine explizite einschränkende Konvertierung hinzu:To correct this code, add an explicit narrowing conversion:

    int i = 0;
    char c = {static_cast<char>(i)};
    
  • Die folgende Initialisierung ist nicht mehr zulässig:The following initialization is no longer allowed:

    void *p = {{0}};
    

    Um diesen Code zu korrigieren, verwenden Sie eines dieser Formulare:To correct this code, use either of these forms:

    void *p = 0;
    // or
    void *p = {0};
    
  • Namenssuche wurde geändert.Name lookup has changed. Der folgende Code wird im C++-Compiler in Visual Studio 2012 und Visual Studio 2013 unterschiedlich aufgelöst:The following code is resolved differently in the C++ compiler in Visual Studio 2012 and Visual Studio 2013:

    enum class E1 { a };
    enum class E2 { b };
    
    int main()
    {
        typedef E2 E1;
        E1::b;
    }
    

    In Visual Studio 2012 wurde E1 im Ausdruck E1::b im globalen Gültigkeitsbereich in ::E1 aufgelöst.In Visual Studio 2012, the E1 in expression E1::b resolved to ::E1 in the global scope. In Visual Studio 2013 wird E1 im Ausdruck E1::b in die Definition typedef E2 in main() aufgelöst und weist den Typ ::E2 auf.In Visual Studio 2013, E1 in expression E1::b resolves to the typedef E2 definition in main() and has type ::E2.

  • Das Objektlayout wurde geändert.Object layout has changed. Auf x64-Computern kann sich das Objektlayout einer Klasse gegenüber vorherigen Versionen möglicherweise ändern.On x64, the object layout of a class may change from previous releases. Wenn eine Funktion vorhanden ist virtual , aber keine Basisklasse mit einer Funktion vorhanden ist virtual , fügt das Objektmodell des Compilers nach dem Layout des Datenelements einen Zeiger in eine virtual Funktions Tabelle ein.If it has a virtual function but it doesn't have a base class that has a virtual function, the object model of the compiler inserts a pointer to a virtual function table after the data member layout. Dies bedeutet, dass das Layout möglicherweise nicht in allen Fällen optimal ist.This means the layout may not be optimal in all cases. In vorherigen Releases wurde mithilfe einer Optimierung für x64 versucht, das Layout zu verbessern. Da dies jedoch in komplexen Codesituationen nicht richtig funktionierte, wurde diese Optimierung in Visual Studio 2013 entfernt.In previous releases, an optimization for x64 would try to improve the layout for you, but because it failed to work correctly in complex code situations, it was removed in Visual Studio 2013. Betrachten Sie z. B. diesen Code:For example, consider this code:

    __declspec(align(16)) struct S1 {
    };
    
    struct S2 {
        virtual ~S2();
        void *p;
        S1 s;
    };
    
  • In Visual Studio 2013 ist das Ergebnis von sizeof(S2) für x64 gleich 48, doch in früheren Releases ergibt dies 32.In Visual Studio 2013, the result of sizeof(S2) on x64 is 48, but in previous releases, it evaluates to 32. Fügen Sie eine Dummy-Basisklasse mit einer Funktion hinzu, um dies im Visual Studio 2013 C++-Compiler für x64 auf 32 zu bewerten virtual :To make this evaluate to 32 in the Visual Studio 2013 C++ compiler for x64, add a dummy base class that has a virtual function:

    __declspec(align(16)) struct S1 {
    };
    
    struct dummy {
        virtual ~dummy() {}
    };
    struct S2 : public dummy {
        virtual ~S2();
        void *p;
        S1 s;
    };
    

    Wenn Sie Positionen im Code finden möchten, die von einer früheren Version optimiert wurden, verwenden Sie einen Compiler aus diesem Release mit der /W3 -Compileroption, und aktivieren Sie Warning C4370.To find places in your code that an earlier release would have tried to optimize, use a compiler from that release together with the /W3 compiler option and turn on warning C4370. Beispiel:For example:

    #pragma warning(default:4370)
    
    __declspec(align(16)) struct S1 {
    };
    
    struct S2 {
        virtual ~S2();
        void *p;
        S1 s;
    };
    

    Vor Visual Studio 2013 gab dieser Code diese Meldung aus: Warnung C4370: 'S2' : Durch bessere Verpackung wurde das Klassenlayout geändert, das vorher eine andere Compilerversion hatte.Before Visual Studio 2013, this code outputs this message: "warning C4370: 'S2' : layout of class has changed from a previous version of the compiler due to better packing".

    Der x86-Compiler weist in allen Versionen des Compilers dasselbe Problem aufgrund eines nicht optimalen Layouts auf.The x86 compiler has the same suboptimal layout issue in all versions of the compiler. Wenn dieser Code beispielsweise für x86 kompiliert wird:For example, if this code is compiled for x86:

    struct S {
        virtual ~S();
        int i;
        double d;
    };
    

    Das Ergebnis von sizeof(S) lautet 24.The result of sizeof(S) is 24. Dies kann jedoch auf 16 reduziert werden, wenn Sie die oben erwähnte Problemumgehung für x64 verwenden:However, it can be reduced to 16 if you use the workaround mentioned for x64:

    struct dummy {
        virtual ~dummy() {}
    };
    
    struct S : public dummy {
        virtual ~S();
        int i;
        double d;
    };
    

StandardbibliothekStandard Library

Der C++-Compiler in Visual Studio 2013 erkennt Konflikte im _ITERATOR_DEBUG_LEVEL, das in Visual Studio 2010 implementiert wurde, sowie RuntimeLibrary-Konflikte.The C++ compiler in Visual Studio 2013 detects mismatches in _ITERATOR_DEBUG_LEVEL, which was implemented in Visual Studio 2010, and RuntimeLibrary mismatches. Diese Konflikte treten auf, wenn die Compileroptionen /MT (statisches Release), /MTd (statisches Debuggen), /MD (dynamisches Release) und /MDd (dynamisches Debuggen) kombiniert werden.These mismatches occur when compiler options /MT (static release), /MTd (static debug), /MD (dynamic release), and /MDd (dynamic debug) are mixed.

  • Wenn der Code die simulierten Aliasvorlagen der vorherigen Version bestätigt, müssen Sie ihn ändern.If your code acknowledges the previous release's simulated alias templates, you have to change it. Beispielsweise müssen Sie statt allocator_traits<A>::rebind_alloc<U>::other jetzt allocator_traits<A>::rebind_alloc<U> verwenden.For example, instead of allocator_traits<A>::rebind_alloc<U>::other, now you have to say allocator_traits<A>::rebind_alloc<U>. Obwohl ratio_add<R1, R2>::type nicht mehr notwendig ist und nun empfohlen wird, ratio_add<R1, R2> zu verwenden, wird der erste dennoch kompiliert, da für ratio<N, D> ein "Typ " typedef für ein reduziertes Verhältnis erforderlich ist. Dies ist derselbe Typ, wenn er bereits reduziert ist.Although ratio_add<R1, R2>::type is no longer necessary and we now recommend that you say ratio_add<R1, R2>, the former will still compile because ratio<N, D> is required to have a "type" typedef for a reduced ratio, which will be the same type if it's already reduced.

  • Sie müssen #include <algorithm> verwenden, wenn Sie std::min() oder std::max() aufrufen.You must use #include <algorithm> when you call std::min() or std::max().

  • Wenn Ihr vorhandener Code die simulierten Bereichs bezogenen Enumerationen der vorherigen Version verwendet – herkömmliche nicht Bereichs bezogene Enumerationen, die in Namespaces integriert sind – müssen Sie ihn ändern.If your existing code uses the previous release's simulated scoped enums—traditional unscoped enums wrapped in namespaces—you have to change it. Wenn Sie z. B. auf den Typ std::future_status::future_status verwiesen haben müssen Sie jetzt std::future_status verwenden.For example, if you referred to the type std::future_status::future_status, now you have to say std::future_status. Die meisten Codes bleiben jedoch unberührt, std::future_status::ready wird beispielsweise weiterhin kompiliert.However, most code is unaffected—for example, std::future_status::ready still compiles.

  • explicit operator bool() ist strenger als der Operator „unspecified-bool-type()“.explicit operator bool() is stricter than operator unspecified-bool-type(). explicit operator bool() ermöglicht explizite Konvertierungen in „bool“ – bei shared_ptr<X> sp sind z.B. static_cast<bool>(sp) und bool b(sp) und „kontextbedingte Konvertierungen“ gültig, die auf „bool“ getestet werden können – z.B. if (sp), !sp oder sp &&.explicit operator bool() permits explicit conversions to bool—for example, given shared_ptr<X> sp, both static_cast<bool>(sp) and bool b(sp) are valid—and Boolean-testable "contextual conversions" to bool—for example, if (sp), !sp, sp && whatever. Allerdings verbietet explicit operator bool() implizite Konvertierungen in „bool“, sodass Sie bool b = sp; nicht verwenden können, und bei einem bestimmten Bool-Rückgabetyp können Sie return sp nicht verwenden.However, explicit operator bool() forbids implicit conversions to bool, so you can't say bool b = sp; and given a bool return type, you can't say return sp.

  • Da echte variadic-Vorlagen nun implementiert wurden, haben _VARIADIC_MAX und verknüpfte Makros keine Auswirkungen.Now that real variadic templates are implemented, _VARIADIC_MAX and related macros have no effect. Wenn Sie noch _VARIADIC_MAX definieren, wird es ignoriert.If you're still defining _VARIADIC_MAX, it's ignored. Wenn Sie die Makromaschinerie bestätigt haben, die dazu dienen sollten, simulierte variadic Vorlagen auf andere Weise zu unterstützen, müssen Sie den Code ändern.If you acknowledged our macro machinery intended to support simulated variadic templates in any other way, you have to change your code.

  • Zusätzlich zu gewöhnlichen Schlüsselwörtern verbieten Header der C++-Standardbibliothek jetzt die Makroersetzung der kontextbezogenen Schlüsselwörter override und final.In addition to ordinary keywords, C++ Standard Library headers now forbid the macro replacement of the context-sensitive keywords override and final.

  • reference_wrapper, ref() und cref() verbieten jetzt, temporäre Objekte zu binden.reference_wrapper, ref(), and cref() now forbid binding to temporary objects.

  • <random>erzwingt jetzt streng die Vorbedingungen für die Kompilierzeit.<random> now strictly enforces its compile-time preconditions.

  • Verschiedene Typmerkmale der C++-Standardbibliothek haben die Vorbedingung „T muss ein vollständiger Typ sein“.Various C++ Standard Library type traits have the precondition "T shall be a complete type". Obwohl der Compiler diese jetzt strenger erzwingt, wird sie möglicherweise nicht in allen Situationen erzwungen.Although the compiler now enforces this precondition more strictly, it may not enforce it in all situations. (Da Verletzungen von Vorbedingungen für die C++-Standardbibliothek kein undefiniertes Verhalten auslösen, garantiert der Standard keine Erzwingung.)(Because C++ Standard Library precondition violations trigger undefined behavior, the Standard doesn't guarantee enforcement.)

  • Die C++-Standardbibliothek unterstützt nicht /clr:oldSyntax.The C++ Standard Library doesn't support /clr:oldSyntax.

  • Die c++ 11-Spezifikation für common_type<> hatte unerwartete und unerwünschte Konsequenzen. insbesondere wird common_type <int, int> :: Type Return int&&.The C++11 specification for common_type<> had unexpected and undesired consequences; in particular, it makes common_type<int, int>::type return int&&. Daher implementiert der Compiler die vorgeschlagene Auflösung für das Bibliotheks-Arbeitsgruppen Problem 2141, das common_type <int, int=""> :: Type Return int zurückgibt.Therefore, the compiler implements the Proposed Resolution for Library Working Group issue 2141, which makes common_type<int, int="">::type return int.

    Als Nebeneffekt dieser Änderung funktioniert der Identitäts Fall nicht mehr (common_type <T> nicht immer zu Typ t).As a side-effect of this change, the identity case no longer works (common_type<T> doesn't always result in type T). Dieses Verhalten entspricht der vorgeschlagenen Lösung, beeinträchtigt jedoch den Code, der auf dem vorherigen Verhalten beruhte.This behavior complies with the Proposed Resolution, but it breaks any code that relied on the previous behavior.

    Wenn ein Identitätstypmerkmal erforderlich ist, verwenden Sie nicht std::identity , das kein Standard ist und in <type_traits> definiert ist, da es nicht bei <void>funktioniert.If you require an identity type trait, don't use the non-standard std::identity that's defined in <type_traits> because it won't work for <void>. Implementieren Sie stattdessen Ihr eigenes Identitätstypmerkmal, um Ihre Anforderungen zu erfüllen.Instead, implement your own identity type trait to suit your needs. Beispiel:Here's an example:

    template < typename T> struct Identity {
        typedef T type;
    };
    

MFC und ATLMFC and ATL

  • Nur Visual Studio 2013: die MFC MBCS-Bibliothek ist nicht in Visual Studio enthalten, da Unicode so beliebt ist und die Verwendung von MBCS erheblich abgelehnt wurde.Visual Studio 2013 only: MFC MBCS Library isn't included in Visual Studio because Unicode is so popular and use of MBCS has declined significantly. Durch diese Änderung orientiert sich MFC näher am Windows SDK, da viele der neuen Steuerelemente und der Meldungen ausschließlich in Unicode vorliegen.This change also keeps MFC more closely aligned with the Windows SDK itself, because many of the new controls and messages are Unicode-only. Wenn Sie die MFC-Bibliothek für MBCS jedoch weiterhin verwenden müssen, können Sie Sie im Microsoft Download Center unter Multibyte-MFC-Bibliothek für Visual Studio 2013herunterladen.However, if you must continue to use the MFC MBCS library, you can download it from the Microsoft Download Center at Multibyte MFC Library for Visual Studio 2013. Diese Bibliothek ist weiterhin im Visual C++ Redistributable Package enthalten.The Visual C++ Redistributable Package still includes this library. (Hinweis: Die MBCS-DLL ist in den C++-Setupkomponenten in Visual Studio 2015 und höher enthalten).(Note: The MBCS DLL is included in the C++ setup components in Visual Studio 2015 and later).

  • Zugriff auf das MFC-Menüband wurde geändert.Accessibility for the MFC ribbon is changed. Anstelle einer Architektur mit einer Ebene gibt es jetzt eine hierarchische Architektur.Instead of a one-level architecture, there is now a hierarchical architecture. Sie können das alte Verhalten weiterhin verwenden, indem Sie CRibbonBar::EnableSingleLevelAccessibilityMode() aufrufen.You can still use the old behavior by calling CRibbonBar::EnableSingleLevelAccessibilityMode().

  • Die Methode CDatabase::GetConnect wurde entfernt.CDatabase::GetConnect method is removed. Zur Verbesserung der Sicherheit wird die Verbindungszeichenfolge nun verschlüsselt gespeichert und nur bei Bedarf entschlüsselt. Sie kann nicht als Nur-Text zurückgegeben werden.To improve security, the connection string is now stored encrypted and is decrypted only as needed; it can't be returned as plain text. Die Zeichenfolge kann mit der Methode CDatabase::Dump abgerufen werden.The string can be obtained by using the CDatabase::Dump method.

  • Die Signatur von CWnd::OnPowerBroadcast wurde geändert.Signature of CWnd::OnPowerBroadcast is changed. Die Signatur dieses Meldungshandlers wird geändert, um ein LPARAM als zweiten Parameter zu akzeptieren.The signature of this message handler is changed to take an LPARAM as the second parameter.

  • Signaturen werden zum anzupassen der Meldungshandler geändert.Signatures are changed to accommodate message handlers. Die Parameterlisten der folgenden Funktionen wurden geändert, um neu hinzugefügte ON_WM_*-Meldungshandler zu verwenden:The parameter lists of the following functions have been changed to use newly added ON_WM_* message handlers:

    • CWnd::OnDisplayChange wurde in (UINT, int, int) anstatt (WPARAM, LPARAM) geändert, sodass das neue ON_WM_DISPLAYCHANGE-Makro in der Meldungszuordnung verwendet werden kann.CWnd::OnDisplayChange changed to (UINT, int, int) instead of (WPARAM, LPARAM) so that the new ON_WM_DISPLAYCHANGE macro can be used in the message map.

    • CFrameWnd::OnDDEInitiate wurde in (CWnd*, UINT, UNIT) anstatt (WPARAM, LPARAM) geändert, sodass das neue ON_WM_DDE_INITIATE-Makro in der Meldungszuordnung verwendet werden kann.CFrameWnd::OnDDEInitiate changed to (CWnd*, UINT, UNIT) instead of (WPARAM, LPARAM) so that the new ON_WM_DDE_INITIATE macro can be used in the message map.

    • CFrameWnd::OnDDEExecute wurde in (CWnd*, HANDLE) anstatt (WPARAM, LPARAM) geändert, sodass das neue ON_WM_DDE_EXECUTE-Makro in der Meldungszuordnung verwendet werden kann.CFrameWnd::OnDDEExecute changed to (CWnd*, HANDLE) instead of (WPARAM, LPARAM) so that the new ON_WM_DDE_EXECUTE macro can be used in the message map.

    • CFrameWnd::OnDDETerminate wurde in den Parameter (CWnd*) anstatt (WPARAM, LPARAM) geändert, sodass das neue ON_WM_DDE_TERMINATE-Makro in der Meldungszuordnung verwendet werden kann.CFrameWnd::OnDDETerminate changed to (CWnd*) as the parameter instead of (WPARAM, LPARAM) so that the new ON_WM_DDE_TERMINATE macro can be used in the message map.

    • CMFCMaskedEdit::OnCut wurde in keine Parameter anstatt (WPARAM, LPARAM) geändert, damit das neue ON_WM_CUT-Makro in der Meldungszuordnung verwendet werden kann.CMFCMaskedEdit::OnCut changed to no parameters instead of (WPARAM, LPARAM) so that the new ON_WM_CUT macro can be used in the message map.

    • CMFCMaskedEdit::OnClear wurde in keine Parameter anstatt (WPARAM, LPARAM) geändert, damit das neue ON_WM_CLEAR-Makro in der Meldungszuordnung verwendet werden kann.CMFCMaskedEdit::OnClear changed to no parameters instead of (WPARAM, LPARAM) so that the new ON_WM_CLEAR macro can be used in the message map.

    • CMFCMaskedEdit::OnPaste wurde in keine Parameter anstatt (WPARAM, LPARAM) geändert, damit das neue ON_WM_PASTE-Makro in der Meldungszuordnung verwendet werden kann.CMFCMaskedEdit::OnPaste changed to no parameters instead of (WPARAM, LPARAM) so that the new ON_WM_PASTE macro can be used in the message map.

  • #ifdef-Anweisungen wurden aus MFC-Headerdateien entfernt.#ifdef directives in the MFC header files are removed. Zahlreiche #ifdef-Anweisungen in den MFC-Headerdateien, die sich auf ältere, nicht unterstützte Versionen von Windows beziehen (WINVER < 0x0501), wurden entfernt.Numerous #ifdef directives in the MFC header files related to unsupported versions of Windows (WINVER < 0x0501) are removed.

  • ATL DLL (atl120.dll) wurde entfernt.ATL DLL (atl120.dll) is removed. ATL wird jetzt als Header und als statische Bibliothek (atls.lib) bereitgestellt.ATL is now provided as headers and a static library (atls.lib).

  • Atlsd.lib, atlsn.lib und atlsnd.lib wurden entfernt.Atlsd.lib, atlsn.lib, and atlsnd.lib are removed. Atls.lib weist keine(n) für Debuggen/Release spezifischen Zeichensatzabhängigkeiten oder Code mehr auf.Atls.lib no longer has character-set dependencies or code that's specific for debug/release. Da die Funktionsweise für Unicode/ANSI und Debuggen/Release identisch ist, ist nur eine Version der Bibliothek erforderlich.Because it works the same for Unicode/ANSI and debug/release, only one version of the library is required.

  • Das ATL-/MFC-Ablaufverfolgungstool wird zusammen mit ATL-DLL entfernt, und der Ablaufverfolgungsmechanismus wird vereinfacht.ATL/MFC Trace tool is removed together with the ATL DLL, and the tracing mechanism is simplified. Der CTraceCategory-Konstruktor akzeptiert jetzt einen Parameter (den Kategorienamen), und mit den TRACE-Makros werden die CRT-Debugberichtsfunktionen aufgerufen.The CTraceCategory constructor now takes one parameter (the category name), and the TRACE macros call the CRT debug reporting functions.

Breaking Changes in Visual Studio 2012Visual Studio 2012 Breaking Changes

CompilerCompiler

  • Die Compileroption /Yl wurde geändert.The /Yl compiler option has changed. Standardmäßig verwendet der Compiler diese Option, die unter bestimmten Umständen zu Fehlern des Typs LNK2011 führen kann.By default, the compiler uses this option, which can lead to LNK2011 errors under certain conditions. Weitere Informationen finden Sie unter /Yl (PCH-Verweis für Debugbibliothek einfügen).For more information, see /Yl (Inject PCH Reference for Debug Library).

  • In Code, der mithilfe von kompiliert /clr wird, enum definiert das Class-Schlüsselwort eine c++ 11-Enumeration, nicht eine Common Language Runtime (CLR)-Enumeration.In code that's compiled by using /clr, the enum class keyword defines a C++11 enum, not a common language runtime (CLR) enum. Um eine CLR-Enumeration zu definieren, müssen Sie beim Zugriff darauf explizit sein.To define a CLR enum, you must be explicit about its accessibility.

  • Verwenden Sie das Schlüsselwort „template“, um einen abhängigen Namen (Kompatibilität mit dem Standard der Sprache C++) explizit zu unterscheiden.Use the template keyword to explicitly disambiguate a dependent name (C++ Language Standard compliance). Im folgenden Beispiel ist das hervorgehobene Schlüsselwort „template“ erforderlich, um die Mehrdeutigkeit zu beseitigen.In the following example, the highlighted template keyword is mandatory to resolve the ambiguity. Weitere Informationen finden Sie unter Namensauflösung für abhängige Typen.For more information, see Name Resolution for Dependent Types.

    template < typename X = "", typename = "" AY = "">
    struct Container { typedef typename AY::template Rebind< X> ::Other AX; };
    
  • Der Konstantenausdruck des Typs „float“ ist nicht mehr als ein „template“-Argument zulässig, wie im folgenden Beispiel gezeigt.Constant expression of type float is no longer allowed as a template argument, as shown in the following example.

    template<float n=3.14>
    struct B {};  // error C2993: 'float': illegal type for non-type template parameter 'n'
    
  • Code, der mit der Befehlszeilenoption /GS kompiliert wird und eine Um-eins-daneben-Schwachstelle aufweist, kann zur Laufzeit zur Beendigung des Prozesses führen (siehe das folgende Pseudocodebeispiel).Code that's compiled by using the /GS command-line option and that has an off-by-one vulnerability may lead to process termination at runtime, as shown in the following pseudocode example.

    char buf[MAX]; int cch; ManipulateString(buf, &cch); // ... buf[cch] = '\0'; // if cch >= MAX, process will terminate
    
  • Die standardmäßige Architektur für x86-Builds wurde in SSE2 geändert. Daher kann der Compiler SSE-Anweisungen ausgeben und XMM-Register für Gleitkommaberechnungen verwenden.The default architecture for x86 builds is changed to SSE2; therefore, the compiler may emit SSE instructions, and will use the XMM registers to perform floating-point calculations. Wenn Sie zum früheren Verhalten zurückkehren möchten, verwenden Sie das Compilerflag /arch:IA32, um die Architektur als IA32 anzugeben.If you want to revert to previous behavior, then use the /arch:IA32 compiler flag to specify the architecture as IA32.

  • Der Compiler gibt möglicherweise die Compilerwarnungen (Level 4) C4703 und C4701 aus, was zuvor nicht der Fall war.The compiler may issue warnings Compiler Warning (level 4) C4703 and C4701 where previously it did not. Der Compiler überprüft strenger die Nutzung nicht initialisierter lokaler Variablen des Typs „Zeiger“.The compiler applies stronger checks for use of uninitialized local variables of pointer type.

  • Wenn das neue Linkerflag /HIGHENTROPYVA angegeben ist, verursacht Windows 8 Speicherzuordnungen, um eine 64-Bit-Adresse zurückzugeben.When the new linker flag /HIGHENTROPYVA is specified, Windows 8 typically causes memory allocations to return a 64-bit address. (Vor Windows 8 haben solche Zuordnungen häufiger Adressen zurückgegeben, die kleiner als 2 GB waren.) Diese Änderung kann Fehler beim Abschneiden von Zeigern in vorhandenem Code verfügbar machen.(Prior to Windows 8, such allocations more often returned addresses that were less than 2 GB.) This change may expose pointer truncation bugs in existing code. Dieser Schalter ist standardmäßig aktiviert.By default, this switch is on. Geben Sie /HIGHENTROPYVA:NO an, um dieses Verhalten zu deaktivieren.To disable this behavior, specify /HIGHENTROPYVA:NO.

  • Der verwaltete Compiler (Visual Basic/C#) unterstützt auch /HIGHENTROPYVA für verwaltete Builds.The managed compiler (Visual Basic/C#) also supports /HIGHENTROPYVA for managed builds. In diesem Fall ist /HIGHENTROPYVAswitch jedoch standardmäßig deaktiviert.However, in this case, the /HIGHENTROPYVAswitch is off by default.

IDEIDE

  • Wenngleich nicht empfohlen wird, Windows Forms-Anwendungen in C++/CLI zu erstellen, wird die Wartung vorhandener C++/CLI UI-Anwendungen unterstützt.Although we recommend that you do not create Windows Forms applications in C++/CLI, maintenance of existing C++/CLI UI applications is supported. Wenn Sie eine Windows Forms-Anwendung oder andere .NET UI-Anwendung erstellen müssen, verwenden Sie C# oder Visual Basic.If you have to create a Windows Forms application, or any other .NET UI application, use C# or Visual Basic. Verwenden Sie C++/CLI nur zu Interoperabilitätszwecken.Use C++/CLI for interoperability purposes only.

Parallel Patterns- und Concurrency Runtime-BibliothekParallel Patterns Library and Concurrency Runtime Library

Die SchedulerType-Enumeration von UmsThreadDefault ist veraltet.The SchedulerType enumeration of UmsThreadDefault is deprecated. Bei Angabe von UmsThreadDefault wird eine veraltete Warnung generiert, und intern erfolgt eine Zuordnung zurück zum ThreadScheduler.Specification of UmsThreadDefault produces a deprecated warning, and internally maps back to the ThreadScheduler.

StandardbibliothekStandard Library

  • Als Folge eines Breaking Change zwischen den Standards C++98/03 und C++11 erfolgt bei Verwendung expliziter Vorlagenargumente zum Aufrufen von make_pair(), z. B. make_pair<int, int>(x, y), in Visual C++ in Visual Studio 2012 in der Regel keine Kompilierung.Following a breaking change between the C++98/03 and C++11 standards, using explicit template arguments to call make_pair() — as in make_pair<int, int>(x, y) — typically doesn't compile in Visual C++ in Visual Studio 2012. Die Lösung besteht darin, immer make_pair() ohne explizite Vorlagen Argumente aufzurufen – wie in make_pair(x, y) .The solution is to always call make_pair() without explicit template arguments — as in make_pair(x, y). Bei Angeben expliziter Vorlagenargumente wird der Zweck der Funktion verfehlt.Providing explicit template arguments defeats the purpose of the function. Wenn eine präzise Steuerung des resultierenden Typs erforderlich ist, verwenden Sie pair anstelle von make_pair, wie in pair<short, short>(int1, int2).If you require precise control over the resulting type, use pair instead of make_pair — as in pair<short, short>(int1, int2).

  • Eine weitere Breaking Change zwischen den Standards c++ 98/03 und c++ 11: Wenn eine implizit in B konvertiert und b implizit in c konvertierbar ist, aber nicht implizit in c konvertiert werden kann, c++ 98/03 und Visual Studio 2010 pair<A, X> (implizit oder explizit) in konvertiert werden dürfen pair<C, X> .Another breaking change between the C++98/03 and C++11 standards: When A is implicitly convertible to B and B is implicitly convertible to C, but A isn't implicitly convertible to C, C++98/03 and Visual Studio 2010 permitted pair<A, X> to be converted (implicitly or explicitly) to pair<C, X>. (Der andere Typ, "X", ist hier nicht von Interesse und nicht spezifisch für den ersten Typ im Paar.) Der C++-Compiler in Visual Studio 2012 erkennt, dass ein nicht implizit in C konvertierbar ist, und entfernt die paar Konvertierung aus der Überladungs Auflösung.(The other type, X, isn't of interest here, and isn't specific to the first type in the pair.) The C++ compiler in Visual Studio 2012 detects that A isn't implicitly convertible to C, and removes the pair conversion from overload resolution. Diese Änderung wirkt sich auf viele Szenarios positiv aus.This change is a positive for many scenarios. Durch das Überladen von func(const pair<int, int>&) und func(const pair<string, string>&) und das Aufrufen von func() mit pair<const char *, const char *> erfolgt die Kompilierung beispielsweise mit dieser Änderung.For example, overloading func(const pair<int, int>&) and func(const pair<string, string>&), and calling func() with pair<const char *, const char *> will compile with this change. Diese Änderung unterbricht jedoch Code, der auf aggressiven Paarkonvertierungen beruhte.However, this change breaks code that relied on aggressive pair conversions. Solcher Code kann normalerweise korrigiert werden, wenn ein Teil der Konvertierung explizit erfolgt, z.B. indem make_pair(static_cast<B>(a), x) an eine Funktion übergeben wird, die pair<C, X> erwartet.Such code can typically be fixed by performing one part of the conversion explicitly—for example, by passing make_pair(static_cast<B>(a), x) to a function that expects pair<C, X>.

  • Visual Studio 2010 simulierte variadic-Vorlagen, wie z. B. make_shared<T>(arg1, arg2, argN), bis zu einem Grenzwert von 10 Argumenten, um Überladungen und Spezialisierungen mithilfe von Präprozessormechanismen zu entfernen.Visual Studio 2010 simulated variadic templates—for example, make_shared<T>(arg1, arg2, argN)—up to a limit of 10 arguments, by stamping out overloads and specializations with preprocessor machinery. In Visual Studio 2012 wurde dieser Grenzwert auf fünf Argumente verringert, um Kompilierzeiten und die Nutzung des Compilerspeichers für die Mehrheit der Benutzer zu verbessern.In Visual Studio 2012, this limit is reduced to five arguments to improve compile times and compiler memory consumption for the majority of users. Allerdings können Sie den vorherigen Grenzwert festlegen, indem Sie _VARIADIC_MAX projektweit explizit auf 10 festlegen.However, you can set the previous limit by explicitly defining _VARIADIC_MAX as 10, project-wide.

  • C++11 17.6.4.3.1 [macro.names]/2 verbietet die Makroersetzung von Schlüsselwörtern, wenn Header der C++-Standardbibliothek enthalten sind.C++11 17.6.4.3.1 [macro.names]/2 forbids macro replacement of keywords when C++ Standard Library headers are included. Die Header geben jetzt Compilerfehler aus, wenn sie Schlüsselwörter erkennen, die durch Makros ersetzt wurden.The headers now emit compiler errors if they detect macro-replaced keywords. (Durch definieren _ALLOW_KEYWORD_MACROS kann dieser Code kompiliert werden, aber wir raten dringend davon ab.) Als Ausnahme ist die Makro Form von new standardmäßig zulässig, da die Header sich mithilfe von umfassend verteidigen #pragma push_macro("new") / #undef new / #pragma pop_macro("new") .(Defining _ALLOW_KEYWORD_MACROS allows such code to compile, but we strongly discourage that usage.) As an exception, the macro form of new is permitted by default, because the headers comprehensively defend themselves by using #pragma push_macro("new")/#undef new/#pragma pop_macro("new"). Bei Festlegung von _ENFORCE_BAN_OF_MACRO_NEW erfolgt genau das, was der Name schon sagt.Defining _ENFORCE_BAN_OF_MACRO_NEW does exactly what its name implies.

  • Um verschiedene Optimierungen und Debugüberprüfungen zu implementieren, unterbricht die Visual Studio-Implementierung der C++-Standardbibliothek absichtlich die binäre Kompatibilität zwischen Versionen von Visual Studio (2005, 2008, 2010, 2012).To implement various optimizations and debugging checks, the C++ Standard Library implementation intentionally breaks binary compatibility among versions of Visual Studio (2005, 2008, 2010, 2012). Wenn die C++-Standardbibliothek verwendet wird, dürfen Objektdateien und statische Bibliotheken, die unter Verwendung verschiedener Versionen kompiliert werden, nicht in einer Binärdatei (EXE oder DLL) gemischt werden, und C++-Standardbibliotheksobjekte dürfen nicht zwischen Binärdateien übergeben werden, die mit verschiedenen Versionen kompiliert werden.When the C++ Standard Library is used, it forbids the mixing of object files and static libraries that are compiled by using different versions into one binary (EXE or DLL), and forbids the passing of C++ Standard Library objects between binaries that are compiled by using different versions. Das Mischen von Objektdateien und statischen Bibliotheken (unter Verwendung der C++-Standardbibliothek), die mit Visual Studio 2010 kompiliert wurden, mit denjenigen, die mit dem C++-Compiler in Visual Studio 2012 kompiliert wurden, löst Linkerfehler aufgrund des Konflikts von _MSC_VER aus. _MSC_VER ist das Makro, das die Hauptversion des Compilers (1700 für _MSC_VER Visual C++ in Visual Studio 2012) enthält.The mixing of object files and static libraries (using the C++ Standard Library that were compiled by using Visual Studio 2010 with ones that were compiled by using The C++ compiler in Visual Studio 2012 emits linker errors about _MSC_VER mismatch, where _MSC_VER is the macro that contains the compiler's major version (1700 for Visual C++ in Visual Studio 2012). Diese Überprüfung kann weder eine gemischte DLL-Verwendung noch eine gemischte Verwendung erkennen, die Visual Studio 2008 oder früher betrifft.This check can't detect DLL mixing, and can't detect mixing that involves Visual Studio 2008 or earlier.

  • Zusätzlich zum Erkennen von Konflikten bei _ITERATOR_DEBUG_LEVEL, das in Visual Studio 2010 implementiert wurde, erkennt der C++-Compiler in Visual Studio 2012 Runtimebibliothekskonflikte.In addition to detecting _ITERATOR_DEBUG_LEVEL mismatches, which was implemented in Visual Studio 2010, The C++ compiler in Visual Studio 2012 detects Runtime Library mismatches. Diese Konflikte treten auf, wenn die Compileroptionen /MT (statisches Release), /MTd (statisches Debuggen), /MD (dynamisches Release) und /MDd (dynamisches Debuggen) kombiniert werden.These mismatches occur when the compiler options /MT (static release), /MTd (static debug), /MD (dynamic release), and /MDd (dynamic debug) are mixed.

  • operator<(), operator>(), operator<=() und operator>=() waren zuvor für die Containerreihen std::unordered_map und stdext::hash_map verfügbar, auch wenn die zugehörigen Implementierungen nicht nützlich waren.operator<(), operator>(), operator<=(), and operator>=() were previously available for the std::unordered_map and stdext::hash_map families of containers, although their implementations were not useful. Diese nicht standardmäßigen Operatoren wurden in Visual C++ in Visual Studio 2012 entfernt.These non-standard operators have been removed in Visual C++ in Visual Studio 2012. Darüber hinaus wurde die Implementierung von operator==() und operator!=() für die std::unordered_map-Reihe erweitert, sodass die Reihe stdext::hash_map abgedeckt ist.Additionally, the implementation of operator==() and operator!=() for the std::unordered_map family has been extended to cover the stdext::hash_map family. (Es wird empfohlen, die Verwendung der stdext::hash_map-Reihe in neuem Code zu vermeiden.)(We recommend that you avoid the use of the stdext::hash_map family in new code.)

  • C++11 22.4.1.4 [locale.codecvt] gibt an, dass codecvt::length() und codecvt::do_length() änderbare stateT&-Parameter verwenden sollten, Visual Studio 2010 hat jedoch const stateT& verwendet.C++11 22.4.1.4 [locale.codecvt] specifies that codecvt::length() and codecvt::do_length() should take modifiable stateT& parameters, but Visual Studio 2010 took const stateT&. Der C++-Compiler in Visual Studio 2012 verwendet stateT& gemäß den Vorgaben des Standards.The C++ compiler in Visual Studio 2012 takes stateT& as mandated by the standard. Dieser Unterschied ist wichtig für alle, die versuchen, die virtuelle Funktion do_length() zu überschreiben.This difference is significant for anyone who is attempting to override the virtual function do_length().

CRTCRT

  • Der C Runtime-Heap (CRT), der für „new“ und „malloc()“ verwendet wird, ist nicht mehr privat.The C Runtime (CRT) heap, which is used for new and malloc(), is no longer private. Die CRT verwendet jetzt den Prozessheap.The CRT now uses the process heap. Dies bedeutet, dass der Heap nicht zerstört wird, wenn eine DLL entladen wird, sodass DLLs, die statisch mit der CRT verknüpfen, sicherstellen müssen, dass der durch den DLL-Code zugewiesene Arbeitsspeicher bereinigt wird, bevor er entladen wird.This means that the heap isn't destroyed when a DLL is unloaded, so DLLs that link statically to the CRT must ensure memory that's allocated by the DLL code is cleaned up before it's unloaded.

  • Die Funktion iscsymf() bestätigt mit negativen Werten.The iscsymf() function asserts with negative values.

  • Die threadlocaleinfostruct-Struktur wurde geändert, damit die Änderungen an Gebietsschemafunktionen berücksichtigt werden.The threadlocaleinfostruct struct has changed to accommodate the changes to locale functions.

  • CRT-Funktionen, die entsprechende systeminterne Funktionen wie memxxx() und strxxx()aufweisen, wurden aus intrin.h entfernt.CRT functions that have corresponding intrinsics such as memxxx(), strxxx() are removed from intrin.h. Wenn Sie intrin.h nur für diese Funktionen hinzugefügt haben, müssen Sie jetzt die entsprechenden CRT-Header hinzufügen.If you included intrin.h only for these functions, you must now include the corresponding CRT headers.

MFC und ATLMFC and ATL

  • Die Fusion-Unterstützung (afxcomctl32. h) wurde entfernt. Daher wurden alle in definierten Methoden <afxcomctl32.h> entfernt.Removed Fusion support (afxcomctl32.h); therefore, all methods that are defined in <afxcomctl32.h> have been removed. Header Dateien <afxcomctl32.h> und <afxcomctl32.inl> wurden gelöscht.Header files <afxcomctl32.h> and <afxcomctl32.inl> have been deleted.

  • Der Name wurde von CDockablePane::RemoveFromDefaultPaneDividier in CDockablePane::RemoveFromDefaultPaneDivider geändert.Changed the name of CDockablePane::RemoveFromDefaultPaneDividier to CDockablePane::RemoveFromDefaultPaneDivider.

  • Die Signatur von CFileDialog::SetDefExt wurde für die Verwendung von LPCTSTR geändert. Deshalb sind Unicode-Builds betroffen.Changed the signature of CFileDialog::SetDefExt to use LPCTSTR; therefore, Unicode builds are affected.

  • Veraltete ATL-Ablaufverfolgungskategorien wurden entfernt.Removed obsolete ATL tracing categories.

  • Die Signatur von CBasePane::MoveWindow wurde so geändert, dass const CRect verwendet wird.Changed the signature of CBasePane::MoveWindow to take a const CRect.

  • Die Signatur von CMFCEditBrowseCtrl::EnableBrowseButton wurde geändert.Changed the signature of CMFCEditBrowseCtrl::EnableBrowseButton.

  • m_fntTabs und m_fntTabsBold aus CMFCBaseTabCtrl entfernt.Removed m_fntTabs and m_fntTabsBold from CMFCBaseTabCtrl.

  • Es wurde ein Parameter zu den CMFCRibbonStatusBarPane-Konstruktoren hinzugefügt.Added a parameter to the CMFCRibbonStatusBarPane constructors. (Dies ist ein Standardparameter, weshalb kein Eingriff in den Quellcode erforderlich ist.)(It is a default parameter, and so it's not source-breaking.)

  • Es wurde ein Parameter zu dem CMFCRibbonCommandsListBox-Konstruktor hinzugefügt.Added a parameter to the CMFCRibbonCommandsListBox constructor. (Dies ist ein Standardparameter, weshalb kein Eingriff in den Quellcode erforderlich ist.)(It is a default parameter, and so it's not source-breaking.)

  • Die AFXTrackMouse-API (und der zugehörige TIMERPROC) wurde entfernt.Removed the AFXTrackMouse API (and related timer proc). Verwenden Sie stattdessen die Win32-API TrackMouseEvent.Use the Win32 TrackMouseEvent API instead.

  • Es wurde ein Parameter zu dem CFolderPickerDialog-Konstruktor hinzugefügt.Added a parameter to the CFolderPickerDialog constructor. (Dies ist ein Standardparameter, weshalb kein Eingriff in den Quellcode erforderlich ist.)(It is a default parameter, and so it's not source-breaking.)

  • Die Größe der CFileStatus-Struktur wurde geändert: Der m_attribute-Member wurde von BYTE in DWORD geändert (entsprechend dem Wert, der von GetFileAttributes zurückgegeben wird).CFileStatus structure size changed: The m_attribute member changed from BYTE to DWORD (to match the value that's returned from GetFileAttributes).

  • CRichEditCtrl und CRichEditView nutzen in Unicode-Builds MSFTEDIT_CLASS (RichEdit 4.1-Steuerelement) anstelle von RICHEDIT_CLASS (RichEdit 3.0-Steuerelement).CRichEditCtrl and CRichEditView use MSFTEDIT_CLASS (RichEdit 4.1 control) instead of RICHEDIT_CLASS (RichEdit 3.0 control) in Unicode builds.

  • AFX_GLOBAL_DATA::IsWindowsThemingDrawParentBackground wurde entfernt, da unter Windows Vista, Windows 7 und Windows 8 immer „TRUE“ festgelegt ist.Removed AFX_GLOBAL_DATA::IsWindowsThemingDrawParentBackground because it's always TRUE on Windows Vista, Windows 7, and Windows 8.

  • AFX_GLOBAL_DATA::IsWindowsLayerSupportAvailable wurde entfernt, da unter Windows Vista, Windows 7 und Windows 8 immer „TRUE“ festgelegt ist.Removed AFX_GLOBAL_DATA::IsWindowsLayerSupportAvailable because it's always TRUE on Windows Vista, Windows 7, and Windows 8.

  • AFX_GLOBAL_DATA::DwmExtendFrameIntoClientArea wurde entfernt.Removed AFX_GLOBAL_DATA::DwmExtendFrameIntoClientArea. Rufen Sie die Windows-API unter Windows Vista, Windows 7 und Windows 8 direkt auf.Call Windows API directly on Windows Vista, Windows 7, and Windows 8.

  • AFX_GLOBAL_DATA::DwmDefWindowProc wurde entfernt.Removed AFX_GLOBAL_DATA::DwmDefWindowProc. Rufen Sie die Windows-API unter Windows Vista, Windows 7 und Windows 8 direkt auf.Call Windows API directly on Windows Vista, Windows 7, and Windows 8.

  • AFX_GLOBAL_DATA::DwmIsCompositionEnabled wurde in IsDwmCompositionEnabled umbenannt, um einen Namenskonflikt zu vermeiden.Renamed AFX_GLOBAL_DATA::DwmIsCompositionEnabled to IsDwmCompositionEnabled to eliminate name collision.

  • Die Bezeichner für verschiedene interne MFC-Timer wurden geändert und die Definitionen in afxres.h (AFX_TIMER_ID_*) verschoben.Changed identifiers for a number of MFC internal timers and moved the definitions to afxres.h (AFX_TIMER_ID_*).

  • Die Signatur der OnExitSizeMove-Methode wurde in Übereinstimmung mit dem Makro ON_WM_EXITSIZEMOVE geändert:Changed the signature of OnExitSizeMove method to agree with the ON_WM_EXITSIZEMOVE macro:

    • CFrameWndEx

    • CMDIFrameWndEx

    • CPaneFrameWnd

  • Name und Signatur von OnDWMCompositionChanged wurden in Übereinstimmung mit dem Makro ON_WM_DWMCOMPOSITIONCHANGED geändert:Changed the name and signature of OnDWMCompositionChanged to agree with the ON_WM_DWMCOMPOSITIONCHANGED macro:

    • CFrameWndEx

    • CMDIFrameWndEx

    • CPaneFrameWnd

  • Die Signatur der OnMouseLeave-Methode wurde in Übereinstimmung mit dem Makro ON_WM_MOUSELEAVE geändert:Changed the signature of OnMouseLeave method to agree with the ON_WM_MOUSELEAVE macro:

    • CMFCCaptionBar

    • CMFCColorBar

    • CMFCHeaderCtrl

    • CMFCProperySheetListBox

    • CMFCRibbonBar

    • CMFCRibbonPanelMenuBar

    • CMFCRibbonRichEditCtrl

    • CMFCSpinButtonCtrl

    • CMFCToolBar ReplaceThisTextCMFCToolBar ReplaceThisText

    • CMFCToolBarComboBoxEdit

    • CMFCToolBarEditCtrl

    • CMFCAutoHideBar

  • Die Signatur von OnPowerBroadcast wurde in Übereinstimmung mit dem Makro ON_WM_POWERBROADCAST geändert:Changed the signature of OnPowerBroadcast to agree with the ON_WM_POWERBROADCAST macro:

    • CFrameWndEx

    • CMDIFrameWndEx

  • Die Signatur von OnStyleChanged wurde in Übereinstimmung mit dem Makro ON_WM_STYLECHANGED geändert:Changed the signature of OnStyleChanged to agree with the ON_WM_STYLECHANGED macro:

    • CMFCListCtrl

    • CMFCStatusBar

  • Die interne Methode FontFamalyProcFonts wurde in FontFamilyProcFonts umbenannt.Renamed the internal method FontFamalyProcFonts to FontFamilyProcFonts.

  • Zahlreiche globale statische CString-Objekte und die folgenden Klassenmembervariablen wurden entfernt, um Speicherverluste in bestimmten Situationen zu vermeiden (durch #defines ersetzt):Removed numerous global static CString objects to eliminate memory leaks in some situations (replaced with #defines), and the following class member variables:

    • CKeyBoardManager::m_strDelimiter

    • CMFCPropertyGridProperty::m_strFormatChar

    • CMFCPropertyGridProperty::m_strFormatShort

    • CMFCPropertyGridProperty::m_strFormatLong

    • CMFCPropertyGridProperty::m_strFormatUShort

    • CMFCPropertyGridProperty::m_strFormatULong

    • CMFCPropertyGridProperty::m_strFormatFloat

    • CMFCPropertyGridProperty::m_strFormatDouble

    • CMFCToolBarImages::m_strPngResType

    • CMFCPropertyGridProperty::m_strFormat

  • Die Signatur von CKeyboardManager::ShowAllAccelerators wurde geändert. Der Parameter zum Trennen von Beschleunigern wurde entfernt.Changed the signature of CKeyboardManager::ShowAllAccelerators and removed the accelerator delimiter parameter.

  • CPropertyPage::GetParentSheet wurde hinzugefügt. Rufen Sie dies in der Klasse CPropertyPage anstelle von GetParent auf, um das ordnungsgemäße übergeordnete Blattfenster abzurufen, welches das übergeordnete bzw. über-übergeordnete Fenster für CPropertyPage sein kann.Added CPropertyPage::GetParentSheet, and in the CPropertyPage class, call it instead of GetParent to get the correct parent sheet window, which may be the parent or a grandparent window to CPropertyPage. Möglicherweise müssen den Code so ändern, dass GetParentSheet anstatt GetParent aufgerufen wird.You might have to change your code to call GetParentSheet instead of GetParent.

  • Unausgeglichenes #pragma warning(push) in ATLBASE.H korrigiert, was die fälschliche Deaktivierung von Warnungen verursacht hat.Fixed unbalanced #pragma warning(push) in ATLBASE.H, which caused warnings to be disabled incorrectly. Diese Warnungen werden nun ordnungsgemäß aktiviert, nachdem ATLBASE.H analysiert wurde.Those warnings are now enabled correctly after ATLBASE.H has been parsed.

  • Auf D2D bezogene Methoden aus AFX_GLOBAL_DATA in _AFX_D2D_STATE verschoben:Moved D2D-related methods from AFX_GLOBAL_DATA to _AFX_D2D_STATE:

    • GetDirectD2dFactory

    • GetWriteFactory

    • GetWICFactory

    • InitD2D

    • ReleaseD2DRefs

    • IsD2DInitialized

    • D2D1MakeRotateMatrix

    • Anstatt afxGlobalData.IsD2DInitialized aufzurufen, rufen Sie beispielsweise AfxGetD2DState->IsD2DInitialized auf.Instead of calling, for example, afxGlobalData.IsD2DInitialized, call AfxGetD2DState->IsD2DInitialized.

  • Veraltete ATL*.CPP-Dateien aus dem Ordner \atlmfc\include\ entfernt.Removed obsolete ATL*.CPP files from the \atlmfc\include\ folder.

  • afxGlobalData-Initialisierung in bedarfsgesteuert geändert anstatt zur CRT-Initialisierungszeit verschoben, um DLLMain-Anforderungen zu erfüllen.Moved afxGlobalData initialization to on-demand instead of at CRT initialization time, to satisfy DLLMain requirements.

  • Die Methode RemoveButtonByIndex wurde zur Klasse CMFCOutlookBarPane hinzugefügt.Added the RemoveButtonByIndex method to the CMFCOutlookBarPane class.

  • CMFCCmdUsageCount::IsFreqeuntlyUsedCmd wurde in IsFrequentlyUsedCmd korrigiert.Corrected CMFCCmdUsageCount::IsFreqeuntlyUsedCmd to IsFrequentlyUsedCmd.

  • Es wurden mehrere Instanzen von RestoreOriginalstate in RestoreOriginalState (CMFCToolBar, CMFCMenuBar, CMFCOutlookBarPane) korrigiert.Corrected several instances of RestoreOriginalstate to RestoreOriginalState (CMFCToolBar, CMFCMenuBar, CMFCOutlookBarPane).

  • Es wurden nicht verwendete Methoden aus CDockablePane entfernt: SetCaptionStyle, IsDrawCaption, IsHideDisabledButtons, GetRecentSiblingPaneInfo und CanAdjustLayout.Removed unused methods from CDockablePane: SetCaptionStyle, IsDrawCaption, IsHideDisabledButtons, GetRecentSiblingPaneInfo, and CanAdjustLayout.

  • Die statischen CDockablePane-Membervariablen m_bCaptionText und m_bHideDisabledButtons wurden entfernt.Removed CDockablePane static member variables m_bCaptionText and m_bHideDisabledButtons.

  • Es wurde eine DeleteString-Überschreibungsmethode zu CMFCFontComboBox hinzugefügt.Added an override DeleteString method to CMFCFontComboBox.

  • Es wurden nicht verwendete Methoden aus CPane entfernt: GetMinLength und IsLastPaneOnLastRow.Removed unused methods from CPane: GetMinLength and IsLastPaneOnLastRow.

  • CPane::GetDockSiteRow(CDockingPanesRow *) wurde in CPane::SetDockSiteRow umbenannt.Renamed CPane::GetDockSiteRow(CDockingPanesRow *) to CPane::SetDockSiteRow.

Breaking Changes in Visual Studio 2010Visual Studio 2010 Breaking Changes

CompilerCompiler

  • Das auto Schlüsselwort hat eine neue Standardbedeutung.The auto keyword has a new default meaning. Da die alte Bedeutung nur selten verwendet wird, sind die meisten Anwendungen von dieser Änderung nicht betroffen.Because use of the old meaning is rare, most applications will not be affected by this change.

  • Das New- static_assert Schlüsselwort wird eingeführt, wodurch ein namens Konflikt verursacht wird, wenn bereits ein Bezeichner mit diesem Namen im Code vorhanden ist.The new static_assert keyword is introduced, which will cause a name conflict if there is already an identifier by that name in your code.

  • Die Unterstützung der neuen Lambda-Notation schließt die Unterstützung für das Codieren einer GUID ohne Anführungszeichen in einem IDL uuid-Attribut aus.Support for the new lambda notation excludes support for coding an unquoted GUID in an IDL uuid attribute.

  • .NET Framework 4 führt das Konzept von Ausnahmen zu beschädigtem Zustand ein. Diese Ausnahmen hinterlassen einen Prozess in einem nicht korrigierbaren beschädigten Zustand.The .NET Framework 4 introduces the concept of corrupted state exceptions, which are exceptions that leave a process in an unrecoverable corrupted state. Standardmäßig können Sie eine Ausnahme zu einem beschädigten Zustand selbst mit der Compileroption /EHa nicht abfangen, die alle anderen Ausnahmen abfängt.By default, you can't catch a corrupted state exception, even with the /EHa compiler option that catches all other exceptions. Um eine Ausnahme zu beschädigtem Zustand explizit abzufangen zu können, verwenden Sie __try-__except-Anweisungen.To explicitly catch a corrupted state exception, use __try-__except statements. Oder wenden Sie das Attribut [HandledProcessCorruptedStateExceptions] an, um eine Funktion zum Abfangen von Ausnahmen zum beschädigten Zustand zu aktivieren.Or, apply the [HandledProcessCorruptedStateExceptions]attribute to enable a function to catch corrupted state exceptions. Diese Änderung betrifft in erster Linie Programmierer, die Ausnahmen zu beschädigtem Zustand möglicherweise abfangen müssen.This change affects primarily system programmers who might have to catch a corrupted state exception. Die acht Ausnahmen sind STATUS_ACCESS_VIOLATION, STATUS_STACK_OVERFLOW, EXCEPTION_ILLEGAL_INSTRUCTION, EXCEPTION_IN_PAGE_ERROR, EXCEPTION_INVALID_DISPOSITION, EXCEPTION_NONCONTINUABLE_EXCEPTION, EXCEPTION_PRIV_INSTRUCTION, STATUS_UNWIND_CONSOLIDATE.The eight exceptions are STATUS_ACCESS_VIOLATION, STATUS_STACK_OVERFLOW, EXCEPTION_ILLEGAL_INSTRUCTION, EXCEPTION_IN_PAGE_ERROR, EXCEPTION_INVALID_DISPOSITION, EXCEPTION_NONCONTINUABLE_EXCEPTION, EXCEPTION_PRIV_INSTRUCTION, STATUS_UNWIND_CONSOLIDATE. Weitere Informationen zu diesen Ausnahmen finden Sie unter GetExceptionCode-Makro.For more information about these exceptions, see the GetExceptionCode macro.

  • Die überarbeitete Compileroption /GS schützt umfassender als in früheren Versionen vor Pufferüberläufen.The revised /GS compiler option guards against buffer overruns more comprehensively than in earlier versions. Diese Version kann im Stapel zusätzliche Sicherheitsüberprüfungen hinzufügen, die die Leistung verringern können.This version might insert additional security checks in the stack that might decrease performance. Verwenden Sie das neue Schlüsselwort __declspec(safebuffers), um den Compiler anzuweisen, keine Sicherheitsüberprüfungen für eine bestimmte Funktion hinzuzufügen.Use the new __declspec(safebuffers) keyword to instruct the compiler to not insert security checks for a particular function.

  • Wenn Sie den Code mit den beiden Compileroptionen /GL (Optimierung des gesamten Programms) und /clr (Common Language Runtime-Kompilierung) kompilieren, wird die Option /GL ignoriert.If you compile with both the /GL (Whole Program Optimization) and /clr (Common Language Runtime Compilation) compiler options, the /GL option is ignored. Diese Änderung wurde vorgenommen, da die Kombination von Compileroptionen nur wenig Vorteile geboten hat.This change was made because the combination of compiler options provided little benefit. Durch diese Änderung wird die Leistung des Builds verbessert.As a result of this change, the performance of the build is improved.

  • Die Unterstützung von Trigraphen ist in Visual Studio 2010 standardmäßig deaktiviert.By default, support for trigraphs is disabled in Visual Studio 2010. Verwenden Sie die Compileroption /Zc:trigraphs, um die Unterstützung von Trigraphen zu aktivieren.Use the /Zc:trigraphs compiler option to enable trigraphs support. Ein Trigraph besteht aus zwei aufeinander folgenden Fragezeichen (??) gefolgt von einem eindeutigen dritten Zeichen.A trigraph consists of two consecutive question marks ("??") followed by a unique third character. Der Compiler ersetzt einen Trigraphen durch ein entsprechendes Interpunktionszeichen.The compiler replaces a trigraph with a corresponding punctuation character. Der Compiler ersetzt beispielsweise den Trigraphen ??= durch das Zeichen „#“.For example, the compiler replaces the ??= trigraph with the '#' character. Verwenden Sie Trigraphen in C-Quelldateien, die einen Zeichensatz aufweisen, der für einige Interpunktionszeichen keine passenden grafischen Darstellungen enthält.Use trigraphs in C source files that use a character set that doesn't contain convenient graphic representations for some punctuation characters.

  • Der Linker unterstützt nicht mehr die Optimierung für Windows 98.The linker no longer supports optimizing for Windows 98. Die Option /OPT (Optimierungen) erzeugt einen Fehler zur Kompilierzeit, wenn Sie /OPT:WIN98 oder /OPT:NOWIN98 angeben.The /OPT (Optimizations) option produces a compile time error if you specify /OPT:WIN98 or /OPT:NOWIN98.

  • Die standardmäßigen Compileroptionen, die von den Buildsystemeigenschaften RuntimeLibrary und DebugInformationFormat angegeben werden, wurden geändert.The default compiler options that are specified by the RuntimeLibrary and DebugInformationFormat build system properties have been changed. Diese Buildeigenschaften werden standardmäßig in Projekten angegeben, die mit den Visual C++-Versionen 7.0 bis 10.0 erstellt wurden.By default, these build properties are specified in projects that are created by Visual C++ releases 7.0 through 10.0. Wenn Sie ein Projekt migrieren, das mit Visual C++ 6.0 erstellt wurde, erwägen Sie, einen Wert für diese Eigenschaften anzugeben.If you migrate a project that was created by Visual C++ 6.0, consider whether to specify a value for these properties.

  • In Visual Studio 2010 entspricht die „RuntimeLibrary“-Eigenschaft der „MultiThreaded“-Eigenschaft (/MD) und die „DebugInformationFormat“-Eigenschaft der „ProgramDatabase“-Eigenschaft (/Zi).In Visual Studio 2010, RuntimeLibrary = MultiThreaded (/MD) and DebugInformationFormat = ProgramDatabase (/Zi). In Visual C++ 9.0 ist RuntimeLibrary = MultiThreaded (/MT) und DebugInformationFormat = Disabled.In Visual C++ 9.0, RuntimeLibrary = MultiThreaded (/MT) and DebugInformationFormat = Disabled.

CLRCLR

  • Die Microsoft C#- und Visual Basic-Compiler können jetzt eine nicht primäre Interopassembly (Nicht-PIA) erzeugen.The Microsoft C# and Visual Basic compilers can now produce a no primary interop assembly (no-PIA). Eine Nicht-PIA-Assembly kann COM-Typen ohne die Bereitstellung der entsprechenden primären Interopassembly (PIA) verwenden.A no-PIA assembly can use COM types without the deployment of the relevant primary interop assembly (PIA). Bei der Nutzung von Nicht-PIA-Assemblys, die mit Visual C# oder Visual Basic erstellt wurden, müssen Sie die PIA-Assembly an den Compile-Befehl verweisen, bevor Sie auf Nicht-PIA-Assemblys verweisen, die die Bibliothek verwenden.When consuming no-PIA assemblies produced by Visual C# or Visual Basic, you must reference the PIA assembly on the compile command before you reference any no-PIA assembly that uses the library.

Visual Studio C++-Projekte und MSBuildVisual Studio C++ projects and MSBuild

  • Visual Studio C++-Projekte basieren jetzt auf dem MSBuild-Tool.Visual Studio C++ projects are now based on the MSBuild tool. Infolgedessen verwenden Projektdateien ein neues XML-Format und das Dateisuffix VCXPROJ.Consequently, project files use a new XML file format and a .vcxproj file suffix. Visual Studio 2010 konvertiert Projektdateien aus früheren Versionen von Visual Studio automatisch in das neue Dateiformat.Visual Studio 2010 automatically converts project files from earlier versions of Visual Studio to the new file format. Ein vorhandenes Projekt ist betroffen, wenn es vom vorherigen Buildtool, VCBUILD.exe, oder Projektdateisuffix, VCPROJ, abhängt.An existing project is affected if it depends on the previous build tool, VCBUILD.exe, or project file suffix, .vcproj.

  • In früheren Versionen unterstützte Visual C++ die späte Auswertung von Eigenschaftenblättern.In earlier releases, Visual C++ supported the late evaluation of property sheets. Beispiel: Ein übergeordnetes Eigenschaftenblatt konnte ein untergeordnetes Eigenschaftenblatt importieren, und das übergeordnete Element konnte eine Variable verwenden, die im untergeordneten Element definiert ist, um andere Variablen zu definieren.For example, a parent property sheet could import a child property sheet, and the parent could use a variable defined in the child to define other variables. Die späte Auswertung ermöglichte dem übergeordneten Element das Verwenden der untergeordneten Variablen, ehe das Eigenschaftenblatt des untergeordneten Elements importiert wurde.Late evaluation enabled the parent to use the child variable even before the child property sheet was imported. In Visual Studio 2010 kann eine Projektblattvariable nicht vor ihrer Definition verwendet werden, da MSBuild nur die frühe Auswertung unterstützt.In Visual Studio 2010, a project sheet variable can't be used before it's defined because MSBuild supports only early evaluation.

IDEIDE

  • Das Dialogfeld zum Beenden von Anwendungen beendet eine Anwendung nicht mehr.The application termination dialog box no longer ends an application. Wenn in früheren Versionen die Funktion abort() oder terminate() die Verkaufsversion einer Anwendung geschlossen hat, zeigte die C-Laufzeitbibliothek im Konsolenfenster oder Dialogfeld eine Meldung zur Beendigung der Anwendung an.In previous releases, when the abort() or terminate() function closed the retail build of an application, the C Run-Time Library displayed an application termination message in a console window or dialog box. Ein Teil der Meldung lautet ungefähr so: „Diese Anwendung hat ein nicht ordnungsgemäßes Beenden der Runtime angefordert.The message said in part, "This application has requested the Runtime to terminate it in an unusual way. Weitere Informationen erhalten Sie von dem für die Anwendung zuständigen Supportteam.“Please contact the application's support team for more information." Die Meldung zum Beenden der Anwendung war redundant, da Windows daraufhin den aktuellen Beendigungs Handler angezeigt hat, der normalerweise das Dialogfeld Windows-Fehlerberichterstattung (Dr. Watson) oder den Visual Studio-Debugger war.The application termination message was redundant because Windows subsequently displayed the current termination handler, which was usually the Windows Error Reporting (Dr. Watson) dialog box or the Visual Studio debugger. Ab Visual Studio 2010 zeigt die C-Laufzeitbibliothek die Meldung nicht mehr an.Starting in Visual Studio 2010, the C Run-Time Library doesn't display the message. Darüber hinaus hindert die Laufzeit die Anwendung am Beenden, bevor ein Debugger gestartet wird.Furthermore, the runtime prevents the application from ending before a debugger starts. Dies ist nur dann eine bedeutende Änderung, wenn Sie vom früheren Verhalten der Meldung zum Beenden der Anwendung abhängig sind.This is a breaking change only if you depend on the previous behavior of the application termination message.

  • Insbesondere in Visual Studio 2010 funktioniert IntelliSense nicht bei C++-/CLI-Code oder Attributen, Alle Verweise suchen funktioniert nicht bei lokalen Variablen, und „Codemodell“ ruft keine Typnamen aus importierten Assemblys ab und löst Typen nicht in ihre vollqualifizierten Namen auf.Specifically for Visual Studio 2010, IntelliSense doesn't work for C++/CLI code or attributes, Find All References doesn't work for local variables, and Code Model doesn't retrieve type names from imported assemblies or resolve types to their fully qualified names.

BibliothekenLibraries

  • Die SafeInt-Klasse ist in Visual C++ und nicht mehr als separater Download erhältlich.The SafeInt class is included in Visual C++ and is no longer in a separate download. Dies ist nur ein Breaking Change, wenn Sie eine Klasse entwickelt haben, die ebenfalls den Namen „SafeInt“ trägt.This is a breaking change only if you've developed a class that's also named "SafeInt".

  • Das Bereitstellungsmodell für Bibliotheken verwendet nicht mehr Manifeste, um eine bestimmte Version einer DLL (Dynamic Link Library) zu suchen.The libraries deployment model no longer uses manifests to find a particular version of a dynamic link library. Stattdessen enthält der Name jeder DLL ihre Versionsnummer, und Sie können die Bibliothek anhand dieses Namens finden.Instead, the name of each dynamic link library contains its version number, and you use that name to locate the library.

  • In früheren Versionen von Visual Studio konnten die Laufzeitbibliotheken neu erstellt werden.In previous versions of Visual Studio, you could rebuild the run time libraries. Das Erstellen eigener Kopien der C-Runtimebibliotheksdateien wird von Visual Studio 2010 nicht mehr unterstützt.Visual Studio 2010 no longer supports building your own copies of the C run time library files.

StandardbibliothekStandard Library

  • Der <iterator> Header wird nicht mehr automatisch von vielen anderen Header Dateien eingeschlossen.The <iterator> header is no longer included automatically by many other header files. Fügen Sie stattdessen diesen Header explizit hinzu, wenn Sie Unterstützung für die im Header definierten eigenständigen Iteratoren benötigen.Instead, include that header explicitly if you require support for the standalone iterators defined in the header. Ein vorhandenes Projekt ist betroffen, wenn es vom vorherigen Buildtool, „VCBUILD.exe“, oder Projektdateisuffix, „.vcproj.iterator“, abhängt.An existing project is affected if it depends on the previous build tool, VCBUILD.exe, or project file suffix, .vcproj.iterator.

  • In der <algorithm> Kopfzeile werden die Funktionen checked_ * und unchecked_ * entfernt.In the <algorithm> header, the checked_* and unchecked_* functions are removed. Im>- <iterator> Header wird die- checked_iterator Klasse entfernt, und die- unchecked_array_iterator Klasse wurde hinzugefügt.And in the <iterator>> header, the checked_iterator class is removed, and the unchecked_array_iterator class has been added.

  • Der Konstruktor CComPtr::CComPtr(int) wurde entfernt.The CComPtr::CComPtr(int) constructor is removed. Dieser Konstruktor erlaubte das Erstellen des CComPtr-Objekts aus dem NULL-Makro, war aber unnötig und ermöglichte unsinnige Konstruktionen auf Basis ganzer Zahlen ungleich null.That constructor allowed a CComPtr object to be constructed from the NULL macro, but was unnecessary and allowed nonsensical constructions from non-zero integers.

    Ein CComPtr kann immer noch aus NULL erstellt werden, was als 0 definiert ist. Dies misslingt jedoch, wenn das Erstellen basierend auf einer anderen ganzen Zahl als dem Literal 0 erfolgt.A CComPtr can still be constructed from NULL, which is defined as 0, but will fail if constructed from an integer other than literal 0. Verwenden Sie nullptr stattdessen.Use nullptr instead.

  • Die folgenden ctype-Memberfunktionen wurden entfernt: ctype::_Do_narrow_s, ctype::_Do_widen_s, ctype::_narrow_s, ctype::_widen_s.The following ctype member functions were removed: ctype::_Do_narrow_s, ctype::_Do_widen_s, ctype::_narrow_s, ctype::_widen_s. Wenn eine Anwendung eine dieser Memberfunktionen verwendet, müssen Sie sie durch die entsprechende nicht sichere Version ersetzen: ctype::do_narrow, ctype::do_widen, ctype::narrow, ctype::widen.If an application uses one of these member functions, you must replace it with the corresponding non-secure version: ctype::do_narrow, ctype::do_widen, ctype::narrow, ctype::widen.

CRT-, MFC- und ATL-BibliothekenCRT, MFC, and ATL Libraries

  • Das Erstellen von CRT-, MFC- und ATL-Bibliotheken durch die Benutzer wird nicht mehr unterstützt.Support has been removed for users to build the CRT, MFC, and ATL libraries. Beispielsweise wird keine entsprechende NMAKE-Datei bereitgestellt.For example, no appropriate NMAKE file is provided. Benutzer haben jedoch weiterhin Zugriff auf den Quellcode für diese Bibliotheken.However, users still have access to the source code for these libraries. Und ein Dokument, in dem die MSBuild-Optionen beschrieben werden, die Microsoft zum Erstellen dieser Bibliotheken verwendet, wird wahrscheinlich in einem Blog des Visual C++-Teams veröffentlicht.And a document that describes the MSBuild options that Microsoft uses to build these libraries will probably be posted in a Visual C++ Team Blog.

  • MFC-Unterstützung für IA64 wurde entfernt.MFC support for IA64 has been removed. Unterstützung für CRT und ATL für IA64 wird jedoch weiter geboten.However, support for the CRT and ATL on IA64 is still provided.

  • Ordnungszahlen werden nicht mehr in MFC-Moduldefinitionsdateien (.def) wiederverwendet.Ordinals are no longer reused in MFC module-definition (.def) files. Diese Änderung bedeutet, dass sich Ordnungszahlen zwischen Nebenversionen nicht unterscheiden. Außerdem wird die Binärkompatibilität für Service Packs und Quick Fix Engineering-Versionen verbessert.This change means ordinals will not be different between minor versions, and binary compatibility for service packs and quick fix engineering releases will be improved.

  • Zur CDocTemplate-Klasse wurde eine neue virtuelle Funktion hinzugefügt.A new virtual function was added to the CDocTemplate class. Diese neue virtuelle Funktion heißt CDocTemplate-Klasse.This new virtual function is CDocTemplate Class. Die vorherige Version von OpenDocumentFile hatte zwei Parameter.The previous version of OpenDocumentFile had two parameters. Die neue Version hat drei Parameter.The new version has three parameters. Zur Unterstützung des Neustart-Managers müssen alle von CDocTemplate abgeleiteten Klassen die Version mit drei Parametern implementieren.To support the restart manager, any class derived from CDocTemplate must implement the version that has three parameters. Der neue Parameter lautet bAddToMRU.The new parameter is bAddToMRU.

Makros und UmgebungsvariablenMacros and Environment Variables

  • Die Umgebungsvariable __MSVCRT_HEAP_SELECT wird nicht mehr unterstützt.The environment variable __MSVCRT_HEAP_SELECT is no longer supported. Diese Umgebungsvariable wurde ersatzlos entfernt.This environment variable is removed and there is no replacement.

Referenz zum Microsoft Macro AssemblerMicrosoft Macro Assembler Reference

  • Mehrere Direktiven wurden aus der Referenz zum Microsoft Macro Assembler-Compiler entfernt.Several directives were removed from the Microsoft Macro Assembler Reference compiler. Die folgenden Anweisungen wurden entfernt: .186, .286, .286P, .287, .8086, .8087 und .NO87.The removed directives are .186, .286, .286P, .287, .8086, .8087, and .NO87.

Breaking Changes in Visual Studio 2008Visual Studio 2008 Breaking Changes

CompilerCompiler

  • Die Plattformen Windows 95, Windows 98, Windows ME und Windows NT werden nicht mehr unterstützt.The Windows 95, Windows 98, Windows ME, and Windows NT platforms are no longer supported. Diese Betriebssysteme wurden aus der Liste der Zielplattformen entfernt.These operating systems have been removed from the list of targeted platforms.

  • Der Compiler unterstützt mehrere Attribute nicht mehr, die direkt mit dem ATL-Server verknüpft sind.The compiler no longer supports multiple attributes that were directly associated with ATL Server. Die folgenden Attribute werden nicht mehr unterstützt:The following attributes are no longer supported:

    • perf_counterperf_counter

    • perf_objectperf_object

    • perfmonperfmon

    • request_handlerrequest_handler

    • soap_handlersoap_handler

    • soap_headersoap_header

    • soap_methodsoap_method

    • tag_nametag_name

Visual Studio C++-ProjekteVisual Studio C++ projects

  • Wenn Sie Projekte aus früheren Versionen von Visual Studio aktualisieren, müssen Sie möglicherweise die Makros WINVER und _WIN32_WINNT so ändern, dass sie größer gleich 0x0500 sind.When upgrading projects from previous versions of Visual Studio, you might have to modify the WINVER and _WIN32_WINNT macros so that they are greater than or equal to 0x0500.

  • Ab Visual Studio 2008 bietet der Assistent für neue Projekte keine Option zum Erstellen eines SQL Server-Projekts in C++.Beginning with Visual Studio 2008, the new project wizard doesn't have an option to create a C++ SQL Server project. SQL Server-Projekte, die mit einer früheren Version von Visual Studio erstellt wurde, werden dennoch kompiliert und funktionieren ordnungsgemäß.SQL Server projects created by using an earlier version of Visual Studio will still compile and work correctly.

  • Die Windows-API-Headerdatei „Winable.h“ wurde entfernt.The Windows API header file Winable.h has been removed. Nehmen Sie stattdessen „Winuser.h“.Include Winuser.h instead.

  • Die Windows-API-Bibliothek „Rpcndr.lib“ wurde entfernt.The Windows API library Rpcndr.lib has been removed. Stellen Sie stattdessen eine Verknüpfung mit „rpcrt4.lib“ her.Link with rpcrt4.lib instead.

CRTCRT

  • Unterstützung für Windows 95, Windows 98, Windows Millennium Edition und Windows NT 4.0 wurde entfernt.Support for Windows 95, Windows 98, Windows Millennium Edition, and Windows NT 4.0 has been removed.

  • Die folgenden globalen Variablen wurden entfernt:The following global variables have been removed:

    • _osplatform_osplatform

    • _osver_osver

    • _winmajor_winmajor

    • _winminor_winminor

    • _winver_winver

  • Die folgenden Funktionen wurden entfernt.The following functions have been removed. Verwenden Sie stattdessen die Windows-API-Funktion GetVersion oder GetVersionEx:Use the Windows API functions GetVersion or GetVersionEx instead:

    • _get_osplatform_get_osplatform

    • _get_osver_get_osver

    • _get_winmajor_get_winmajor

    • _get_winminor_get_winminor

    • _get_winver_get_winver

  • Die Syntax für SAL-Anmerkungen wurde geändert.The syntax for SAL Annotations has changed. Weitere Informationen finden Sie unter SAL-Anmerkungen.For more information, see SAL Annotations.

  • Der IEEE-Filter unterstützt jetzt den SSE-4.1-Anweisungssatz.The IEEE filter now supports the SSE 4.1 instruction set. Weitere Informationen finden Sie unter _fpieee_flt_fpieee_flt.For more information, see _fpieee_flt_fpieee_flt.

  • Die C-Laufzeitbibliotheken in Visual Studio sind nicht mehr von der System-DLL „msvcrt.dll“ abhängig.The C Run-Time Libraries that ship with Visual Studio are no longer dependent on the system DLL msvcrt.dll.

StandardbibliothekStandard Library

  • Unterstützung für Windows 95, Windows 98, Windows Millennium Edition und Windows NT 4.0 wurde entfernt.Support for Windows 95, Windows 98, Windows Millennium Edition, and Windows NT 4.0 has been removed.

  • Beim Kompilieren im Debugmodus mit angegebenem _HAS_ITERATOR_DEBUGGING (ersetzt durch _ITERATOR_DEBUG_LEVEL nach Visual Studio 2010) bestätigt eine Anwendung nun, wenn ein Iterator versucht, sich über die Grenzen eines zugrunde liegenden Containers zu inkrementieren oder zu dekrementieren.When compiling in debug mode with _HAS_ITERATOR_DEBUGGING defined (superseded by _ITERATOR_DEBUG_LEVEL after Visual Studio 2010), an application will now assert when an iterator attempts to increment or decrement past the bounds of the underlying container.

  • Die Membervariable „c“ der stack-Klasse ist nun als geschützt deklariert.The member variable c of the stack Class is now declared protected. Diese Membervariable war zuvor als öffentlich deklariert.Previously, this member variable was declared public.

  • Das Verhalten von money_get::do_get wurde geändert.The behavior of money_get::do_get has changed. Zuvor wurden bei der Analyse eines Geldbetrags mit mehr Nachkommaziffern als von frac_digits oder do_get angefordert alle verwendet.Previously, when parsing a monetary amount with more fraction digits than are called for by frac_digits, do_get used to consume them all. Nun beendet do_get die Analyse, nachdem die höchste Anzahl der Zeichen von frac_digits verwendet wurde.Now, do_get stops parsing after consuming at most frac_digits characters.

ATLATL

  • ATL kann nicht ohne eine Abhängigkeit von CRT erstellt werden.ATL can't be built without a dependency on CRT. In früheren Versionen konnten Sie #define ATL_MIN_CRT verwenden, um ein ATL-Projekt minimal abhängig von CRT zu machen.In earlier versions of Visual Studio, you could use #define ATL_MIN_CRT to make an ATL project minimally dependent on CRT. In Visual Studio 2008 sind alle ATL-Projekte minimal abhängig von CRT, und zwar unabhängig davon, ob ATL_MIN_CRT definiert ist.In Visual Studio 2008, all ATL projects are minimally dependent on CRT regardless of whether ATL_MIN_CRT is defined.

  • Die Codebasis von ATL-Server wurde als freigegebenes Quellcodeprojekt auf CodePlex veröffentlicht und wird nicht als Teil von Visual Studio installiert.The ATL Server codebase has been released as a shared source project on CodePlex and isn't installed as part of Visual Studio. Die Datencodierungs- und -decodierungsklassen in atlenc.h und Hilfsfunktionen und -klassen in atlutil.h und atlpath.h wurden beibehalten und sind jetzt Bestandteil der ATL-Bibliothek.Data encoding and decoding classes from atlenc.h and utility functions and classes from atlutil.h and atlpath.h have been kept and are now part of the ATL library. Mehrere Dateien, die mit ATL-Server verknüpft sind, gehören nicht mehr zu Visual Studio.Several files associated with ATL Server are no longer part of Visual Studio.

  • Einige Funktionen sind nicht mehr in der DLL enthalten.Some functions are no longer included in the DLL. Sie befinden sich weiter in der Importbibliothek.They are still located in the import library. Dies betrifft Code nicht, der die Funktionen statisch verwendet.This will not affect code that uses the functions statically. Dies wirkt sich nur auf Code aus, der diese Funktionen dynamisch verwendet.It will affect only the code that uses these functions dynamically.

  • Die Makros PROP_ENTRY und PROP_ENTRY_EX wurden als veraltet eingestuft und aus Sicherheitsgründen durch die Makros PROP_ENTRY_TYPE und PROP_ENTRY_TYPE_EX ersetzt.The macros PROP_ENTRY and PROP_ENTRY_EX have been deprecated and replaced with the macros PROP_ENTRY_TYPE and PROP_ENTRY_TYPE_EX for security reasons.

Freigegebene ATL-/MFC-KlassenATL/MFC Shared Classes

  • ATL kann nicht ohne eine Abhängigkeit von CRT erstellt werden.ATL can't be built without a dependency on CRT. In früheren Versionen konnten Sie #define ATL_MIN_CRT verwenden, um ein ATL-Projekt minimal abhängig von CRT zu machen.In earlier versions of Visual Studio, you could use #define ATL_MIN_CRT to make an ATL project minimally dependent on CRT. In Visual Studio 2008 sind alle ATL-Projekte minimal abhängig von CRT, und zwar unabhängig davon, ob ATL_MIN_CRT definiert ist.In Visual Studio 2008, all ATL projects are minimally dependent on CRT regardless of whether ATL_MIN_CRT is defined.

  • Die Codebasis von ATL-Server wurde als freigegebenes Quellcodeprojekt auf CodePlex veröffentlicht und wird nicht als Teil von Visual Studio installiert.The ATL Server codebase has been released as a shared source project on CodePlex and isn't installed as part of Visual Studio. Die Datencodierungs- und -decodierungsklassen in atlenc.h und Hilfsfunktionen und -klassen in atlutil.h und atlpath.h wurden beibehalten und sind jetzt Bestandteil der ATL-Bibliothek.Data encoding and decoding classes from atlenc.h and utility functions and classes from atlutil.h and atlpath.h have been kept and are now part of the ATL library. Mehrere Dateien, die mit ATL-Server verknüpft sind, gehören nicht mehr zu Visual Studio.Several files associated with ATL Server are no longer part of Visual Studio.

  • Einige Funktionen sind nicht mehr in der DLL enthalten.Some functions are no longer included in the DLL. Sie befinden sich weiter in der Importbibliothek.They are still located in the import library. Dies betrifft Code nicht, der die Funktionen statisch verwendet.This will not affect code that uses the functions statically. Dies wirkt sich nur auf Code aus, der diese Funktionen dynamisch verwendet.It will affect only the code that uses these functions dynamically.

MFCMFC

  • CTime-Klasse: Die CTime-Klasse akzeptiert jetzt Datumsangaben beginnend mit 1.1.1900 unserer Zeitrechnung.CTime Class: The CTime class now accepts dates starting from 1/1/1900 C.E. anstatt 01.01.1970.instead of 1/1/1970 C.E.

  • Aktivierreihenfolge von Steuerelementen in MFC-Dialogfeldern: Die richtige Aktivierreihenfolge mehrerer Steuerelemente in einem MFC-Dialogfeld ist gestört, wenn ein MFC-ActiveX-Steuerelement in die Aktivierreihenfolge eingefügt wird.Tab order of controls in MFC dialogs: The correct tab order of multiple controls in an MFC dialog is disturbed if an MFC ActiveX control is inserted in the tab order. Diese Änderung behebt dieses Problem.This change corrects that problem.

    Erstellen Sie beispielsweise eine MFC-Dialogfeldanwendung, die über ein ActiveX-Steuerelement und mehrere Bearbeitungssteuerelemente verfügt.For example, create an MFC dialog application that has an ActiveX control and several edit controls. Positionieren Sie das ActiveX-Steuerelement in der Mitte der Aktivierreihenfolge der Bearbeitungssteuerelemente.Position the ActiveX control in the middle of the tab order of the edit controls. Starten Sie die Anwendung, klicken Sie auf ein Bearbeitungs Steuerelement, dessen Aktivier Reihenfolge nach dem ActiveX-Steuerelement und dann auf Tab. vor dieser Änderung ging der Fokus auf das Bearbeitungs Steuerelement, das dem ActiveX-Steuerelement folgt, anstatt auf das nächste Bearbeitungs Steuerelement in der aktiviStart the application, click an edit control whose tab order is after the ActiveX control, then tab. Prior to this change, the focus went to the edit control following the ActiveX control instead of the next edit control in the tab order.

  • CFileDialogKlasse: benutzerdefinierte Vorlagen für die CFileDialog Klasse können nicht automatisch zu Windows Vista portiert werden.CFileDialog Class: Custom templates for the CFileDialog class can't be automatically ported to Windows Vista. Sie sind immer noch verwendbar ist, verfügen jedoch nicht über die zusätzliche Funktionalität oder das Aussehen von Dialogfeldern im Windows Vista-Stil.They are still usable, but will not have the additional functionality or looks of Windows Vista style dialogs.

  • CWnd-Klasse und CFrameWnd-Klasse: Die Methode CWnd::GetMenuBarInfo wurde entfernt.CWnd Class and CFrameWnd Class: The CWnd::GetMenuBarInfo method was removed.

    Die Methode CFrameWnd::GetMenuBarInfo ist jetzt eine nicht virtuelle Methode.The CFrameWnd::GetMenuBarInfo method is now a non-virtual method. Weitere Informationen finden Sie unter Funktion „GetMenuBarInfo“ im Windows SDK.For more information, see GetMenuBarInfo Function in the Windows SDK.

  • MFC ISAPI-Unterstützung: MFC unterstützt das Erstellen von Anwendungen mit der ISAPI (Internet Server Application Programming Interface) nicht mehr.MFC ISAPI support: MFC no longer supports building applications with the Internet Server Application Programming Interface (ISAPI). Wenn Sie eine ISAPI-Anwendung erstellen möchten, rufen Sie die ISAPI-Erweiterungen direkt auf.If you want to build an ISAPI application, call the ISAPI extensions directly.

  • Veraltete ANSI-APIs: Die ANSI-Versionen mehrerer MFC-Methoden sind veraltet.Deprecated ANSI APIs: The ANSI versions of several MFC methods are deprecated. Verwenden Sie in Ihren künftigen Anwendungen die Unicode-Versionen dieser Methoden.Use the Unicode versions of those methods in your future applications. Weitere Informationen finden Sie unter Buildanforderungen für allgemeine Windows Vista-Steuerelemente.For more information, see Build Requirements for Windows Vista Common Controls.

Breaking Changes in Visual Studio 2005Visual Studio 2005 Breaking Changes

CRTCRT

  • Zahlreiche Funktionen sind veraltet.Many functions have been deprecated. Siehe Veraltete CRT-Funktionen.See Deprecated CRT Functions.

  • Viele Funktionen überprüfen jetzt ihre Parameter und halten die Ausführung an, falls ungültige Parameter angegeben wurden.Many functions now validate their parameters, halting execution if given invalid parameters. Durch diese Überprüfung wird möglicherweise Code unterbrochen, der ungültige Parameter übergibt und sich darauf verlässt, dass die Funktion sie ignoriert oder bloß einen Fehlercode zurückgibt.This validation may break code that passes invalid parameters and relies on the function ignoring them or just returning an error code. Siehe Parameter Validierung.See Parameter Validation.

  • Der Deskriptorwert „-2“ wird jetzt verwendet, um anzugeben, dass stdout und stderr nicht für die Ausgabe verfügbar sind, z. B. bei einer Windows-Anwendung ohne Konsolenfenster.The file descriptor value -2 is now used to indicate that stdout and stderr aren't available for output, for example, in a Windows application that has no console window. Der bisher verwendete Wert war -1.The previous value used was -1. Weitere Informationen finden Sie unter _fileno.For more information, see _fileno.

  • Die Singlethread-CRT-Bibliotheken (libc.lib und libcd.lib) wurden entfernt.The single-threaded CRT libraries (libc.lib and libcd.lib) have been removed. Verwenden Sie die Multithread-CRT-Bibliotheken.Use the multi-threaded CRT libraries. Das Compilerflag /ML wird nicht mehr unterstützt.The /ML compiler flag is no longer supported. Nicht sperrende Versionen einiger Funktionen wurden in Fällen hinzugefügt, in denen der Leistungsunterschied zwischen Multithreadcode und Singlethreadcode erheblich sein kann.Non-locking versions of some functions have been added in cases where the performance difference between the multithreaded code and the single-threaded code is potentially significant.

  • Die Überladung von pow, double pow (Int, Int) wurde entfernt, um besser dem Standard zu entsprechen.The overload of pow, double pow(int, int), was removed to better conform with the standard.

  • Der Formatspezifizierer „%n“ wird standardmäßig in der printf-Funktionsreihe nicht mehr unterstützt, da er grundsätzlich unsicher ist.The %n format specifier is no longer supported by default in any of the printf family of functions because it's inherently insecure. Gemäß des Standardverhaltens, wenn „%n“ angetroffen wird, wird der ungültige Parameterhandler aufgerufen.If %n is encountered, the default behavior is to invoke the invalid parameter handler. Verwenden Sie _set_printf_count_output, um die Unterstützung von „%n“ zu aktivieren (siehe auch _get_printf_count_output).To enable %n support, use _set_printf_count_output (also see _get_printf_count_output).

  • sprintf gibt jetzt das negative Vorzeichen einer Null mit Vorzeichen aus.sprintf now prints the negative sign of a signed zero.

  • swprintf wurde geändert, um dem Standard zu entsprechen. Es erfordert jetzt einen size-Parameter.swprintf has been changed to conform with the Standard; it now requires a size parameter. Die Form von swprintf ohne size-Parameter wurde als veraltet markiert.The form of swprintf without a size parameter has been deprecated.

  • _set_security_error_handler wurde entfernt._set_security_error_handler has been removed. Entfernen Sie alle Aufrufe der Funktion. Der Standardhandler bietet eine viel sicherere Möglichkeit des Umgangs mit Sicherheitsfehlern.Remove any calls to that function; the default handler is a much safer way of dealing with security errors.

  • time_t ist jetzt ein 64-Bit-Wert (sofern _USE_32BIT_TIME_T definiert ist).time_t is now a 64-bit value (unless _USE_32BIT_TIME_T is defined).

  • Die Funktionen _spawn und _wspawn lassen errno gemäß des C-Standards bei Erfolg unverändert.The _spawn, _wspawn Functions now leave errno untouched on success, as specified by the C Standard.

  • RTC verwendet jetzt standardmäßig Breitzeichen.RTC now uses wide characters by default.

  • Wortunterstützungsfunktionen zur Gleitkommasteuerung sind für Anwendungen veraltet, die mit /CLR oder /CLR:PURE kompiliert wurden.Floating-point control word support functions have been deprecated for applications compiled with /CLR or /CLR:PURE. Folgende Funktionen sind betroffen: _clear87, _clearfp, _control87, _controlfp, _fpreset, _status87 und _statusfp.The affected functions are _clear87, _clearfp, _control87, _controlfp, _fpreset, _status87, _statusfp. Sie können die Warnung zur Veraltung deaktivieren, indem Sie _CRT_MANAGED_FP_NO_DEPRECATE definieren. Doch die Verwendung dieser Funktionen in verwaltetem Code ist unvorhersehbar und wird nicht unterstützt.You can disable the deprecation warning by defining _CRT_MANAGED_FP_NO_DEPRECATE, but the use of these functions in managed code is unpredictable and unsupported.

  • Einige Funktionen geben jetzt Const-Zeiger zurück.Some functions now return const pointers. Das alte, Nicht-Const-Verhalten kann durch Definition von _CONST_RETURN reaktiviert werden.The old, non-const behavior can be reinstated by defining _CONST_RETURN. Die folgenden Funktionen sind betroffen:The affected functions are

    • memchr, wmemchrmemchr, wmemchr

    • strchr, wcschr, _mbschr, _mbschr_lstrchr, wcschr, _mbschr, _mbschr_l

    • strpbrk, wcspbrk, _mbspbrk, _mbspbrk_lstrpbrk, wcspbrk, _mbspbrk, _mbspbrk_l

    • strrchr, wcsrchr, _mbsrchr, _mbsrchr_lstrrchr, wcsrchr, _mbsrchr, _mbsrchr_l

    • strstr, wcsstr, _mbsstr, _mbsstr_lstrstr, wcsstr, _mbsstr, _mbsstr_l

  • Beim Verknüpfen mit Setargv.obj oder Wsetargv.obj ist es nicht mehr möglich, die Erweiterung eines Platzhalterzeichens in der Befehlszeile zu unterdrücken, indem es in doppelte Anführungszeichen gesetzt wird.When linking with Setargv.obj or Wsetargv.obj, it's no longer possible to suppress the expansion of a wildcard character on the command line by enclosing it in double quotes. Weitere Informationen finden Sie unter Erweitern von Platzhalterargumenten.For more information, see Expanding Wildcard Arguments.

Standardbibliothek (2005)Standard Library (2005)

  • Die Ausnahme Klasse (in der <exception> Kopfzeile) wurde in den- std Namespace verschoben.The exception class (located in the <exception> header) has been moved to the std namespace. In früheren Versionen befand sich diese Klasse im globalen Namespace.In previous versions, this class was in the global namespace. Zum Beheben von Fehlern, die angeben, dass die exception-Klasse nicht gefunden werden kann, müssen Sie zu Ihrem Code die folgende using-Anweisung hinzufügen: using namespace std;To resolve any errors indicating that the exception class can't be found, add the following using statement to your code: using namespace std;

  • Wenn valarray::resize() aufgerufen wird, geht der Inhalt von valarray verloren und wird durch Standardwerte ersetzt.When calling valarray::resize(), the contents of the valarray will be lost and will be replaced by default values. Die Methode resize() dient zum erneuten Initialisieren von valarray, ohne dass ein dynamisches Wachsen wie bei einem Vektor erfolgt.The resize() method is intended to reinitialize the valarray rather than grow it dynamically like a vector.

  • Debugiteratoren: Bei Anwendungen, die mit einer Debugversion der C-Laufzeitbibliothek erstellt wurden und Iteratoren falsch verwenden, erfolgen möglicherweise zur Laufzeit Assert-Vorgänge.Debug Iterators: Applications built with a debug version of the C-Runtime Library and which use iterators incorrectly might begin to see asserts at runtime. Zum Deaktivieren dieser Assert-Vorgänge müssen Sie _HAS_ITERATOR_DEBUGGING (ersetzt durch _ITERATOR_DEBUG_LEVEL nach Visual Studio 2010) auf 0 festlegen.To disable these asserts, you must define _HAS_ITERATOR_DEBUGGING (superseded by _ITERATOR_DEBUG_LEVEL after Visual Studio 2010) to 0. Weitere Informationen finden Sie unter Unterstützung für iteratordebugging .For more information, see Debug Iterator Support

Visual C++ .NET 2003: Bedeutende ÄnderungenVisual C++ .NET 2003 Breaking Changes

CompilerCompiler

  • Schließende Klammern sind jetzt für die definierte Präprozessordirektive (C2004) erforderlich.Closing parentheses now required for the defined preprocessor directive (C2004).

  • Explizite Spezialisierungen finden in der primären Vorlage keine Vorlagenparameter mehr (Compilerfehler C2146).Explicit specializations no longer find template parameters from primary template (Compiler Error C2146).

  • Auf einen geschützten Member (n) kann nur über eine Memberfunktion einer Klasse (B) zugegriffen werden, die von der Klasse (A) erbt, deren Member (n) ist (Compilerfehler C2247).A protected member (n) can only be accessed through a member function of a class (B) that inherits from the class (A) of which it (n) is a member (Compiler Error C2247).

  • Verbesserte Zugriffsprüfungen im Compiler erkennen jetzt Basisklassen, auf die nicht zugegriffen werden kann (Compilerfehler C2248).Improved accessibility checks in compiler now detect inaccessible base classes (Compiler Error C2248).

  • Eine Ausnahme kann nicht abgefangen werden, wenn auf den Destruktor und/oder Kopierkonstruktor nicht zugegriffen werden kann (C2316).An exception can't be caught if the destructor and/or copy constructor is inaccessible (C2316).

  • Standardargumente für Zeiger auf Funktionen sind nicht mehr zulässig (Compilerfehler C2383).Default arguments on pointers to functions no longer allowed (Compiler Error C2383).

  • Ein statischer Datenmember darf nicht über eine abgeleitete Klasse initialisiert werden (Compilerfehler C2477).A static data member can't be initialized via derived class (Compiler Error C2477).

  • Die Initialisierung eines typedef ist vom Standard nicht zulässig und generiert nun einen Compilerfehler (Compilerfehler C2513).The initialization of a typedef isn't allowed by the standard and now generates a compiler error (Compiler Error C2513).

  • bool ist nun ein richtiger Typ (Compilerfehler C2632).bool is now a proper type (Compiler Error C2632).

  • Eine UDC kann jetzt mit überladenen Operatoren Mehrdeutigkeit erzeugen (C2666).A UDC can now create ambiguity with overloaded operators (C2666).

  • Mehr Ausdrücke gelten jetzt als gültige NULL-Zeigerkonstanten (Compilerfehler C2668).More expressions are now considered valid null pointer constants (Compiler Error C2668).

  • template<> ist nun an Stellen erforderlich, an denen der Compiler sie zuvor impliziert hat (Compilerfehler C2768).template<> is now required in places where the compiler would previously imply it (Compiler Error C2768).

  • Die explizite Spezialisierung einer Memberfunktion außerhalb der Klasse ist nicht gültig, wenn die Funktion bereits über eine Vorlagenklassenspezialisierung explizit spezialisiert wurde (Compilerfehler C2910).The explicit specialization of a member function outside the class isn't valid if the function has already been explicitly specialized via a template class specialization (Compiler Error C2910).

  • Nichttyp-Vorlagenparameter für Gleitkommas sind nicht mehr zulässig (Compilerfehler C2993).Floating point non-type template parameters are no longer allowed (Compiler Error C2993).

  • Klassenvorlagen sind nicht als Vorlagentypargumente zulässig (C3206).Class templates aren't allowed as template type arguments (C3206).

  • Friend-Funktionsnamen werden im enthaltenden Namespace nicht mehr eingeführt (Compilerfehler C3767).Friend function names are no longer introduced into containing namespace (Compiler Error C3767).

  • Zusätzliche Kommas in Makros werden vom Compiler nicht mehr akzeptiert (C4002).The compiler will no longer accept extra commas in a macro (C4002).

  • Ein Objekt des POD-Typs, das mit der Initialisierung des Formulars '()' erstellt wurde, wird mit 'default' initialisiert (C4345).An object of POD type constructed with an initializer of the form () will be default-initialized (C4345).

  • TypeName ist jetzt erforderlich, wenn ein abhängiger Name als Typ behandelt wird (Compilerwarnung (Stufe 1) C4346).typename is now required if a dependent name is to be treated as a type (Compiler Warning (level 1) C4346).

  • Funktionen, die fälschlicherweise als Vorlagenspezialisierungen eingestuft wurden, werden nicht mehr so eingestuft (C4347).Functions that were incorrectly considered template specializations are no longer considered so (C4347).

  • Statische Datenmember können nicht über eine abgeleitete Klasse initialisiert werden (C4356).Static data members can't be initialized via derived class (C4356).

  • Eine Klassenvorlagenspezialisierung muss vor ihrer Verwendung in einem Rückgabetyp definiert werden (Compilerwarnung (Stufe 3) C4686).A class template specialization needs to be defined before it is used in a return type (Compiler Warning (level 3) C4686).

  • Der Compiler meldet jetzt nicht erreichbaren Code (C4702).The compiler now reports unreachable code (C4702).

Weitere InformationenSee also

Neuerungen bei Visual C++ in Visual StudioWhat's New for Visual C++ in Visual Studio