Compiler für Projekte für intelligente Geräte
Aktualisiert: November 2007
Visual Studio beinhaltet die folgenden Compiler, die auf in intelligenten Geräten verwendete Mikroprozessoren abzielen:
32-Bit-C-/C++-Compiler, zum Kompilieren und Binden von in C und C++ geschriebenen 32-Bit-ARM-Programmen.
32-Bit-C-/C++-Compiler, zum Kompilieren und Binden von in C und C++ geschriebenen 32-Bit-Programmen für Renesas SH-4.
Ein C-/C++-Compiler, zum Kompilieren und Binden von C- und C++-Programmen für MIPS16, MIPS32 und MIPS64.
Die Compiler erzeugen Objektdateien (OBJ-Dateien) im Common Object File Format (COFF). Die Compilerprogramme kompilieren jede Quelldatei und, sofern nicht anders angegeben, eine Objektdatei pro Kompiliervorgang. Die Compiler berücksichtigen die Optionen, die an der Befehlszeile (command line, CL), in der CL-Umgebungsvariablen und allen angegebenen Antwortdateien aufgeführt sind.
Unterschiede zwischen Desktop- und Gerätecompilern in Visual Studio
Unterschied |
Beschreibung |
---|---|
Registerkarte Erweitert, Dropdownliste Für Architektur kompilieren. |
Für Geräteprojekte stehen in Projekteigenschaften, Registerkarte Erweitert, Liste Für Architektur kompilieren, unter dem Knoten C/C++ folgende Optionen im Dropdownfeld zur Verfügung: Arm4 (/QRarch4), ARM5 (/QRarch5), Arm4t (/QRarch4t), ARM5t (/QRarch5t). |
Registerkarte Erweitert, Dropdownliste Interwork ARM- und ARM-Thumb-Aufrufe. |
Für Geräteprojekte stehen in Projekteigenschaften, Registerkarte Erweitert, Liste Interwork ARM- und ARM-Thumb-Aufrufe, unter dem Knoten C/C++ die folgenden Optionen im Dropdownfeld zur Verfügung: Ja (/QRInterwork-return) und Nein. Ist diese Option auf Ja festgelegt, generiert der Compiler Thunk-Code für Interwork ARM-Code mit 16 und 32 Bit. |
Registerkarte Erweitert, Dropdownliste Gleitkommaemulation aktivieren. |
Für Geräteprojekte stehen in Projekteigenschaften, Registerkarte Erweitert, Dropdownliste Gleitkommaemulation aktivieren, unter dem Knoten C/C++ die folgenden Optionen im Dropdownfeld zur Verfügung: Ja und Nein. Ist diese Option auf Ja festgelegt, ermöglicht der Compiler die Emulation von Gleitkommaoperationen. |
Registerkarte Präprozessor, Eingabefeld Präprozessordefinitionen. |
Für Geräteprojekte sind in Projekteigenschaften, Registerkarte Präprozessor, Eingabefeld Präprozessordefinitionen, unter dem Knoten C/C++ das Kontrollkästchen Vom übergeordneten Projekt erben oder Projektstandard und die Schaltfläche Makros zum Hinzufügen von Makros verfügbar. |
Registerkarte Optimierung, Dropdownliste Gleitkommakonsistenz. |
Für Geräteprojekte ist in Projekteigenschaften, Registerkarte Optimierung, Dropdownliste Gleitkommakonsistenz, unter dem Knoten C/C++ eine Dropdownliste zum Auswählen von Standardkonsistenz oder Konsistenz verbessern (/Op) verfügbar. |
Weitere Informationen finden Sie unter Compileroptionen alphabetisch sortiert.
Änderungen gegenüber vorherigen Versionen von Visual Studio
Die Compiler von Visual Studio 2005 und Visual Studio 2003 im Vergleich
Weil die Gerätecompiler auf dem Visual C++-Compiler für Desktopcomputer basieren, vermittelt die Betrachtung der Unterschiede zwischen den Desktopcompilerversionen ein gute Vorstellung von den Unterschieden zwischen den Gerätecompilern für eMbedded Visual C++ und den Gerätecompilern von Visual Studio 2005. Informationen über Unterschiede zwischen Visual Studio 6.0 und Visual Studio 2003 finden Sie unter Compatibility and Compliance Issues in Visual C++.
In der folgenden Tabelle wird zusammengefasst, wo sich die Compiler von Visual Studio 2003 und Visual Studio 2005 unterscheiden.
Problem |
Beschreibung |
---|---|
Memberzeiger müssen in Funktionsaufrufen jetzt mit qualifiziertem Namen, Adressoperator (&) und Klammern angegeben werden. |
Code, der für frühere Compilerversionen geschrieben wurde, die nur den Methodennamen erforderten, verursacht jetzt den Compilerfehler C3867 oder die Compilerwarnung C4867. Diese Diagnose ist gemäß dem ISO-C++-Standard erforderlich. Zum Erstellen eines Zeigers auf eine Memberfunktion müssen der Adressoperator (&) und der vollständig qualifizierte Methodenname verwendet werden. Fehler können sich ergeben, wenn der &-Operator und der vollständig qualifizierte Methodenname nicht angefordert werden oder wenn in Funktionsaufrufen Klammern fehlen. Wenn der Funktionsname ohne Argumentliste verwendet wird, ergibt sich daraus ein Funktionszeiger, der in verschiedene Typen konvertiert werden kann. Daher kann der Code zur Laufzeit möglicherweise ein unerwartetes Verhalten erzeugen. |
Eine Klasse muss für eine friend-Deklaration zugänglich sein. |
Frühere Visual C++-Compiler ermöglichten eine friend-Deklaration für eine Klasse, auf die im Gültigkeitsbereich der Klasse, die die Deklaration enthielt, nicht zugegriffen werden konnte. In Visual C++ 2005 generiert der Compiler unter diesen Umständen den Compilerfehler C2248. Um diesen Fehler zu beheben, ändern Sie die Zugriffsebene der Klasse, die in der friend-Deklaration angegeben ist. Diese Änderung am Compiler wurde vorgenommen, um Konformität mit dem ISO-C++-Standard zu gewährleisten. |
Eine explizite Spezialisierung ist in einem Kopierkonstruktor und Kopierzuweisungsoperator nicht zulässig. |
Code, der eine explizite Vorlagenspezialisierung für einen Kopierkonstruktor oder Kopierzuweisungsoperator voraussetzt, generiert jetzt den Compilerfehler C2299. Im ISO C++-Standard ist diese Verwendung nicht zulässig. Diese Änderung wurde aus Konformitätsgründen vorgenommen und um die Codeportabilität zu verbessern. |
Eine nicht spezialisierte Klassenvorlage kann nicht als Vorlagenargument in einer Basisklassenliste verwendet werden. |
Die Verwendung des Klassennamens einer nicht spezialisierten Vorlage in der Basisklassenliste für eine Klassendefinition verursacht den Compilerfehler C3203. Es ist unzulässig, den Klassennamen einer nicht spezialisierten Vorlage als Vorlagenparameter in einer Basisklassenliste zu verwenden. Die Vorlagentypparameter müssen explizit zum Vorlagenklassennamen hinzugefügt werden, wenn dieser als Vorlagenparameter in einer Basisklassenliste verwendet wird. Diese Änderung wurde aus Konformitätsgründen vorgenommen und um die Codeportabilität zu verbessern. |
using-Deklarationen von geschachtelten Typen sind nicht mehr zulässig. |
Code, der eine using-Deklaration für einen geschachtelten Typ aufweist, generiert jetzt den Compilerfehler C2885. Um diesen Fehler zu beheben, müssen Sie Verweise auf geschachtelte Typen voll qualifizieren, den Typ in einen Namespace einfügen oder eine typedef erstellen. Diese Änderung wurde aus Konformitätsgründen vorgenommen und um die Codeportabilität zu verbessern. |
Die Compileroption /YX wurde entfernt. |
Die Compileroption /YX generierte automatische Unterstützung für vorkompilierte Headerdateien. Sie wurde standardmäßig von der Entwicklungsumgebung verwendet. Wenn Sie die Compileroption /YXaus den Buildkonfigurationen entfernen, kann dies zu schnelleren Builds führen. Die Compileroption /YX kann nicht nur Probleme mit dem Leistungsverhalten, sondern auch ein unerwartetes Laufzeitverhalten bedingen. Verwenden Sie daher /Yc, Vorkompilierte Headerdatei erstellen und /Yu,Vorkompilierte Headerdatei verwenden, da Sie mit diesen Optionen besser steuern können, wie vorkompilierte Header verwendet werden. |
Die Compileroption /Oa und die Compileroption /Ow wurden entfernt. |
Die Compileroption /Oa und die Compileroption/Ow wurden entfernt und werden daher ignoriert. Verwenden Sie den declspec-Modifizierer noalias oder restrict, um anzugeben, wie der Compiler das Aliasing durchführt. |
Die Compileroption /Op wurde entfernt. |
Die Compileroption /Opwurde entfernt. Sie können stattdessen /fp:precise verwenden. |
Die Compileroption /ML und die Compileroption /MLdwurden entfernt. |
Visual C++ 2005 stellt keine Unterstützung für Singlethread-CRT-Bibliotheken, die statisch eingebunden werden, mehr bereit. Sie können stattdessen /MT und /MTd verwenden. |
Die Compileroptionen /G3, /G4, /G5, /G6, /G7 und /GBwurden entfernt. |
Der Compiler verwendet jetzt ein gemischtes Modell, mit dem versucht wird, eine Ausgabedatei zu erstellen, die für alle Architekturen ideal geeignet ist. |
Die Compileroption /Gf wurde entfernt. |
Sie können stattdessen /GF verwenden. /GF fügt Zeichenfolgen, für die ein Stringpooling durchgeführt wurde, in einen schreibgeschützten Abschnitt ein, was sicherer ist als das Einfügen in einen beschreibbaren Abschnitt mit /Gf. |
Die Compileroption /GS ist jetzt standardmäßig aktiviert. |
Die Pufferüberlaufprüfung ist jetzt standardmäßig aktiviert. Sie können die Pufferüberlaufprüfung mit /GS- deaktivieren. |
Die Variable /Zc:wchar_t ist jetzt standardmäßig aktiviert. |
Dies entspricht dem ISO C++-Standardverhalten: Einer wchar_t-Variablen wird standardmäßig der integrierte Typ zugewiesen, und nicht der Typ short unsigned int. Diese Änderung führt zur Aufhebung der Binärkompatibilität, wenn in den Clientcode Bibliotheken eingebunden werden, die ohne Angabe von /Zc:wchar_t kompiliert wurden. Sie können /Zc:wchar_t- verwenden, um das alte, nicht dem Standard entsprechende Verhalten wiederherzustellen. Diese Änderung wurde eingeführt, um standardmäßig konformen Code zu erstellen. |
Die Variable /Zc:forScope ist jetzt standardmäßig aktiviert. |
Dies entspricht dem ISO C++-Standardverhalten: Code, der voraussetzt, dass eine Variable, die in einer for-Schleife deklariert wurde, außerhalb des Gültigkeitsbereichs der for-Schleife verwendet werden kann, wird jetzt nicht mehr kompiliert. Sie können /Zc:forScope verwenden, um das alte, nicht dem Standard entsprechende Verhalten wiederherzustellen. Diese Änderung wurde eingeführt, um standardmäßig konformen Code zu erstellen. |
Erzwingen Sie die Parameterprüfung für Visual C++-Attribute. |
Code, der benannte Attribute an einen Attributkonstruktor in Anführungszeichen übergibt, wenn dieser nicht den Typ string hat, bzw. ohne Anführungszeichen, wenn dieser den Typ string hat, generiert jetzt den Compilerfehler C2065 bzw. die Compilerwarnung (Stufe 1) C4581. Früher wurden alle Compilerattribute als Zeichenfolgen interpretiert, und der Compiler fügte bei Bedarf fehlende Anführungszeichen ein. Die Attributunterstützung wurde durch eine zusätzliche Validierung der Parameterprüfung verbessert. Diese Änderung verhindert, dass die Übergabe falscher Argumente an einen Attributkonstruktor zu einem unerwarteten Verhalten führt. |
Compiler fügt nicht den Typ int als Standardtyp in Deklarationen ein. |
In Code, in dem in einer Deklaration kein Typ angegeben wird, wird nicht mehr standardmäßig der Typ int verwendet. Der Compiler generiert die Compilerwarnung C4430 oder die Compilerwarnung (Stufe 4) C4431. Der ISO C++-Standard unterstützt die Verwendung von int als Standardtyp nicht. Mit dieser Änderung wird sichergestellt, dass Sie den Typ erhalten, der explizit angegeben wurde. |
Weitere Informationen finden Sie unter Wichtige Änderungen im Visual C++ 2005-Compiler.