Wichtige Änderungen in Visual C++
In diesem Dokument werden die wichtigen Änderungen in Visual C++ 2010 aufgelistet.
Visual C++-Compiler
Das Auto-Schlüsselwort weist eine neue Standardbedeutung auf. Da die alte Bedeutung nur selten verwendet wird, sind die meisten Anwendungen von dieser Änderung nicht betroffen.
Die Einführung des neuen static_assert-Schlüsselworts verursacht einen Namenskonflikt, falls es bereits einen Bezeichner mit diesem Namen im Code gibt.
Die Unterstützung für die neue Lambdanotation schließt keine Unterstützung für das Codieren einer GUID ohne Anführungszeichen in einem uuid-Attribut (IDL-Attribut) ein.
.NET Framework 4 führt das Konzept beschädigter Zustandsausnahmen ein, wobei es sich um Ausnahmen handelt, die einen Prozess in einem nicht behebbaren beschädigten Zustand belassen. Beschädigte Zustandsausnahmen können Sie standardmäßig nicht abfangen, auch nicht mit der /EHa-Compileroption, die alle anderen Ausnahmen abfängt.
Um eine beschädigte Zustandsausnahme explizit abzufangen, verwenden Sie die __try/__except-Anweisungen. Oder wenden Sie das [HandledProcessCorruptedStateExceptions]-Attribut an, um eine Funktion für das Abfangen beschädigter Zustandsausnahmen zu aktivieren.
Diese Änderung betrifft hauptsächlich Systemprogrammierer, die möglicherweise eine beschädigte Zustandsausnahme abfangen müssen. 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. Weitere Informationen zu diesen Ausnahmen finden Sie im Makro GetExceptionCode.
Die überarbeitete /GS-Compileroption schützt umfassender vor Pufferüberläufen als in früheren Versionen. In dieser Version können zusätzliche Sicherheitsüberprüfungen im Stapel eingefügt werden, die u. U. die Leistung verringern. Verwenden Sie das neue __declspec(safebuffers)-Schlüsselwort, um den Compiler anzuweisen, keine Sicherheitsüberprüfungen für eine bestimmte Funktion einzufügen.
Wenn Sie die Kompilierung sowohl mit der /GL (Optimierung des gesamten Programms)-Compileroption und der /clr (Kompilierung der Common Language Runtime)-Compileroption ausführen, wird die /GL-Option ignoriert. Diese Änderung wurde vorgenommen, da die Kombination von Compileroptionen wenig Vorteile geboten hat. Diese Änderung bewirkt eine Verbesserung der Leistung des Builds.
Die Unterstützung von Trigraphen ist in Visual C++ 2010 standardmäßig deaktiviert. Verwenden Sie die /Zc:trigraphs-Compileroption, um die Unterstützung von Trigraphen zu aktivieren. Ein Trigraph besteht aus zwei aufeinander folgenden Fragezeichen ("??") gefolgt von einem eindeutigen dritten Zeichen. Der Compiler ersetzt einen Trigraphen durch ein entsprechendes Interpunktionszeichen. Der Compiler ersetzt z. B. den Trigraphen "??=" durch das #-Zeichen (Nummernzeichen). Verwenden Sie Trigraphen in C-Quelldateien, die einen Zeichensatz verwenden, der keine zweckmäßigen grafischen Darstellungen für einige Interpunktionszeichen enthält.
Der Linker unterstützt nicht mehr die Optimierung für Windows 98. Die /OPT (Optimierungen)-Option erzeugt einen Kompilierzeitfehler, wenn Sie /OPT:WIN98 oder /OPT:NOWIN98 angeben.
Die standardmäßigen Compileroptionen, die durch die RuntimeLibrary-Buildsystemeigenschaft und die DebugInformationFormat-Buildsystemeigenschaft angegeben werden, wurden geändert. Standardmäßig werden diese Buildeigenschaften in Projekten angegeben, die von den Visual C++-Versionen 7.0 bis 10.0 erstellt werden. Wenn Sie ein Projekt migrieren, das von Visual C++ 6.0 erstellt wurde, geben Sie ggf. einen Wert für diese Eigenschaften an.
In Visual C++ 2010, RuntimeLibrary = MultiThreaded (/MD) und DebugInformationFormat = ProgramDatabase (/Zi). In Visual C++ 9.0 RuntimeLibrary = MultiThreaded (/MT) und DebugInformationFormat = Deaktiviert.
Common Language Runtime (CLR)
- Microsoft C#- und Visual Basic-Compiler können jetzt eine nicht primäre Interopassembly (nicht-PIA) erzeugen. Eine Nicht-PIA-Assembly kann COM-Typen ohne die Bereitstellung der relevanten primären Interopassembly (PIA) verwenden. Bei der Verwendung von Nicht-PIA-Assemblys, die von Visual C# oder Visual Basic erzeugt wurden, müssen Sie im Kompilierbefehl auf die PIA-Assembly verweisen, bevor Sie einen Verweis auf eine Nicht-PIA-Assembly erstellen, die die Bibliothek verwendet.
Visual C++-Projekte und MSBuild
Visual C++-Projekte basieren jetzt auf dem Tool MSBuild. Infolgedessen verwenden Projektdateien ein neues XML-Datei-Format und das Dateisuffix .vcxproj. Visual C++ 2010 konvertiert Projektdateien aus früheren Versionen von Visual Studio automatisch in das neue Dateiformat.
Ein vorhandenes Projekt ist betroffen, wenn es vom vorherigen Buildtool VCBUILD.exe abhängt oder das Projektdateisuffix .vcproj aufweist.
In früheren Versionen von Visual C++ wurde die späte Auswertung für Eigenschaftenblätter unterstützt. Ein übergeordnetes Eigenschaftenblatt konnte z. B. ein untergeordnetes Eigenschaftenblatt importieren, und das übergeordnete Element konnte eine im untergeordneten Element definierte Variable verwenden, um andere Variablen zu definieren. Aufgrund der späten Auswertung war es möglich, dass das übergeordnete Element die untergeordnete Variable verwendet, noch bevor das untergeordnete Eigenschaftenblatt importiert wurde. In Visual C++ 2010 kann eine Projektblattvariable erst verwendet werden, nachdem sie definiert wurde, da MSBuild nur die frühe Auswertung unterstützt.
Integrierte Entwicklungsumgebung
Mit dem Dialogfeld zur Anwendungsbeendigung wird eine Anwendung nicht mehr beendet.
Wenn in vorherigen Versionen die abort()-Funktion oder die terminate()-Funktion die Verkaufsversion einer Anwendung geschlossen hat, hat die C-Laufzeitbibliothek in einem Konsolenfenster oder Dialogfeld eine Meldung zur Anwendungsbeendigung angezeigt. Ein Teil der Meldung lautete: "Diese Anwendung hat ein nicht ordnungsgemäßes Beenden der Runtime angefordert. Wenden Sie sich für weitere Informationen an das für die Anwendung zuständige Supportteam."
Die Meldung zur Anwendungsbeendigung war redundant, da Windows anschließend den aktuellen Beendigungshandler angezeigt hat, bei dem es sich normalerweise um das Dialogfeld der Windows-Fehlerberichterstattung (Dr. Watson oder den Visual Studio-Debugger handelt. Ab Visual Studio 2010 zeigt die C-Laufzeitbibliothek die Meldung nicht mehr an. Weiterhin verhindert die Laufzeit, dass die Anwendung beendet wird, bevor ein Debugger startet.
Diese Änderung ist nur dann wichtig, wenn eine Abhängigkeit vom früheren Verhalten der Meldung zur Anwendungsbeendigung vorliegt.
Für Visual Studio 2010 funktioniert IntelliSense nicht für C++-/CLI-Code oder -Attribute, Alle Verweise suchen funktioniert nicht für lokale Variablen, und das Codemodell ruft keine Typnamen aus importierten Assemblys ab bzw. es löst keine Typen in ihre vollqualifizierten Namen auf.
Visual C++-Bibliotheken
Die SafeInt-Klasse ist in Visual C++ und nicht mehr in einem separaten Download enthalten. Diese Änderung ist nur dann wichtig, wenn Sie eine Klasse entwickelt haben, die ebenfalls den Namen "SafeInt" aufweist.
Das Bereitstellungsmodell für Bibliotheken verwendet keine Manifeste mehr, um eine bestimmte Version einer Dynamic Link Library zu suchen. Stattdessen enthält der Name jeder Dynamic Link Library eine Versionsnummer, und Sie verwenden diesen Namen zum Suchen der Bibliothek. Weitere Informationen finden Sie unter Bereitstellung in Visual C++ 2010.
In früheren Versionen von Visual Studio konnten Sie die Laufzeitbibliotheken neu erstellen. Visual C++ 2010 unterstützt nicht mehr das Erstellen von eigenen Kopien der C-Laufzeitbibliotheksdateien.
Standard Template Library
Der <iterator>-Header wird von vielen anderen Headerdateien nicht mehr automatisch eingeschlossen. Schließen Sie diesen Header stattdessen explizit ein, wenn Sie Unterstützung für die eigenständigen im <interator>-Header definierten Iteratoren benötigen.
Im <algorithm>-Header wurden die checked_*-Funktion und die unchecked_*-Funktion entfernt. Und im <iterator>-Header wurde die checked_iterator-Klasse entfernt, und die unchecked_array_iterator-Klasse wurde hinzugefügt.
Der CComPtr::CComPtr(int)-Konstruktor wurde entfernt. Dieser Konstruktor ermöglichte das Erstellen eines CComPtr-Objekts mit dem Makro NULL, war aber unnötig und erlaubte unsinnige Konstruktionen aus ganzen Zahlen ungleich 0 (null).
Ein CComPtr kann immer noch mit dem NULL-Makro erstellt werden, das als 0 definiert ist. Das Erstellen scheitert jedoch, wenn es sich bei der ganzen Zahl nicht um das Literal 0 handelt. Dieses Problem tritt wahrscheinlich in der Situation auf, die im folgenden Pseudocode beschrieben ist.
pair<X, CComPtr<T>> myVar; myVar = make_pair(x, NULL);
Um die zweite Anweisung zu korrigieren, verwenden Sie das nullptr-Schlüsselwort anstelle des Makros NULL.
myVar = make_pair(x, nullptr)
Die folgenden ctype-Memberfunktionen wurden entfernt: 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.
CRT-, MFC- und ATL-Bibliotheken
Das Erstellen von CRT-, MFC- und ATL-Bibliotheken durch Benutzer wird nicht mehr unterstützt. Beispielsweise wird keine entsprechende nmake-Datei bereitgestellt. Die Benutzer haben jedoch weiterhin Zugriff auf den Quellcode für diese Bibliotheken. Außerdem wird in einem Visual C++-Teamblog wahrscheinlich ein Dokument veröffentlicht, das die MSBuild-Optionen beschreibt, mit denen Microsoft diese Bibliotheken erstellt.
Die MFC-Unterstützung für IA64 wurde entfernt. Es wird jedoch weiterhin Unterstützung für CRT und ATL für IA64 bereitgestellt.
Ordnungszahlen werden nicht mehr in MFC-Moduldefinitionsdateien (.def) wiederverwendet. Diese Änderung bedeutet, dass sich Ordnungszahlen zwischen Nebenversionen nicht unterscheiden und dass die binäre Kompatibilität für Service Packs und Quick Fix-Engineeringversionen verbessert wird.
Der CDocTemplate-Klasse wurde eine neue virtuelle Funktion hinzugefügt. Diese neue virtuelle Funktion ist CDocTemplate::OpenDocumentFile. Die frühere Version von OpenDocumentFile verfügte über zwei Parameter. Die neue Version verfügt über drei Parameter. Zur Unterstützung des Neustart-Managers muss jede von CDocTemplate abgeleitete Klasse die Version implementieren, die über drei Parameter verfügt. Weitere Informationen zur Funktion finden Sie unter CDocTemplate::OpenDocumentFile. Der neue Parameter ist bAddToMRU.
Makros und Umgebungsvariablen
- Die Umgebungsvariable __MSVCRT_HEAP_SELECT wird nicht mehr unterstützt. Diese Umgebungsvariable wurde entfernt und nicht ersetzt.
Referenz zum Microsoft Macro Assembler
- Mehrere Direktiven wurden aus dem Compiler für die Referenz zum Microsoft Macro Assembler entfernt. Die entfernten Direktiven sind .186, .286, .286P, .287, .8086, .8087 und .NO87.