Freigeben über


Verwaltete Ausdrücke in C++

Aktualisiert: November 2007

Dieses Thema gilt für folgende Anwendungsbereiche:

Edition

Visual Basic

C#

C++

Web Developer

Express

Standard

Pro und Team

Tabellenlegende:

Vorhanden

Nicht vorhanden

Befehl oder Befehle, die standardmäßig ausgeblendet sind.

Die meisten in Visual C++ verfassten Ausdrücke werden von der verwalteten Ausdrucksauswertung akzeptiert. In den folgenden Themen erhalten Sie neben spezifischen Informationen auch Erläuterungen zu einigen der nicht unterstützten Ausdruckstypen:

  • Bezeichner und Typen

  • Funktionsauswertung

  • Operatoren

  • Überladene Operatoren

  • Zeichenfolgen

  • Typumwandlungen

  • Vergleich und Zuweisung von Objekten

  • typeof-Operator und sizeof-Operator

  • Boxing

  • Eigenschaftenauswertung

Die Ausdrucksauswertung ignoriert die Zugriffsqualifizierer public, protected, internal und private. Sie können eine private-Methode z. B. im Fenster Überwachen aufrufen.

Die Ausdrucksauswertung führt alle Auswertungen in einem impliziten, unsicheren Kontext durch. Das geschieht unabhängig davon, ob der ausgeführte Code sicher oder unsicher ist.

Mithilfe der Regeln für die automatische Erweiterung zeigt der Debugger den Inhalt eines Datentyps in aussagekräftiger Form an. Falls erforderlich, können Sie benutzerdefinierte Elemente für die automatische Erweiterung hinzufügen, um eigene benutzerdefinierte Datentypen anzuzeigen. Weitere Informationen finden Sie unter Anzeigen von Elementen eines benutzerdefinierten Datentyps.

Bezeichner und Typen

In Debuggerausdrücken können alle Bezeichner verwendet werden, die innerhalb des aktuellen Gültigkeitsbereichs sichtbar sind. Wenn der Debugger beispielsweise in der magh-Funktion angehalten wird, können Sie jeden innerhalb von magh sichtbaren Bezeichner verwenden, einschließlich von Konstanten, Variablennamen und Funktionsnamen.

Der Debugger kann alle Variablen eines primitive-Typs, eines enum-Typs oder eines intrinsic-Typs ordnungsgemäß anzeigen. Bei Variablen des class-Typs zeigt der Debugger den Wert ordnungsgemäß an, der auf dem in der Ableitungshierarchie ganz unten stehenden Typ basiert. Angenommen, es gibt ein Objekt leo vom Typ lion, der vom Typ cat abgeleitet ist. Bei Auswertung von leo.clawlength würden Sie in diesem Fall den korrekten Wert für ein Objekt vom Typ lion erhalten.

Sie können jedem linksseitigen Ausdruck, der ein l-Wert eines primitiven Typs ist, einen neuen Wert zuweisen. Zuweisungen für Klassen- und Arraytypen werden nicht unterstützt.

Funktionsauswertung

Der Debugger unterstützt die Auswertung von Funktionen, einschließlich überladener Funktionen. Daher können Sie einen der folgenden Ausdrücke eingeben, um die korrekte Version der überladenen Funktion aufzurufen:

kanga ()
kanga (roo)

Beim Auswerten einer Funktion im Debugger wird der Code dieser Funktion aufgerufen und ausgeführt. Wenn die Funktion Nebeneffekte aufweist (z. B. Zuweisen von Speicher oder Ändern des Werts einer globalen Variablen), wird durch das Auswerten der Funktion in einem Debugfenster der Status des Programms geändert, was zu unerwarteten Ergebnissen führen kann.

Wenn Sie in einer überladenen Funktion einen Haltepunkt festlegen, hängt dessen Position davon ab, wie Sie die Funktion angeben. Wenn Sie lediglich den Namen der Funktion angeben, legt der Debugger an jeder Überladung dieses Funktionsnamens einen Haltepunkt fest. Wenn Sie dagegen die vollständige Signatur angeben, d. h. den Funktionsnamen und die komplette Argumentliste, wird nur an der angegebenen Überladung ein Haltepunkt festgelegt.

Operatoren

Der Debugger wertet die meisten integrierten Operatoren ordnungsgemäß aus, einschließlich der folgenden:

  • Relationale Operatoren: (expr1 >expr2, expr1 < expr2, expr1 <= expr2, expr1 => expr2, expr1 == expr2, expr1 != expr2).

  • Boolesche Operatoren: (expr1 && expr2, expr1 || expr2).

  • Bedingter Operator: (expr1 ? expr2 : expr3).

  • Arithmetische Operatoren: ( expr1 + expr2, expr1 - expr2,expr1 * expr2, expr1 / expr2, expr1 % expr2).

  • Bitweise Operatoren: (expr1 & expr2, expr1 ^ expr2, expr1 | expr2, expr1 ~ expr2).

  • Schiebeoperatoren. Beispiele: (expr1 >> expr2, expr1 << expr2, expr1 >>> expr2).

  • Zuweisungsoperatoren: ( lvalue = expr2, lvalue *= expr2, lvalue /= expr2, lvalue %= expr2, lvalue += expr2, lvalue -= expr2, lvalue <<= expr2, lvalue >>=expr2, lvalue &= expr2, lvalue ^= expr2, lvalue |= expr2 ).

  • Unäre Operatoren Beispiele: ( + expr1, - expr1, expr1++, ++ expr1, expr1--, -- expr1 ).

Sie können den Kommaoperator verwenden, um eine Reihe von Ausdrücken einzugeben: expr1, expr2,expr3.

Überladene Operatoren

Die meisten überladenen Operatoren funktionieren im Debugger.

Die überladenen Infixoperatoren +, -, /, % und & funktionieren:

  • expr1 + expr2

  • expr1expr2

  • expr1 / expr2

  • expr1 % expr2

  • expr1 & expr2

Die überladenen Infixoperatoren =, &&, &, ||, | und ^ funktionieren nicht:

  • expr1 = expr2

  • expr1 && expr2

  • expr1 & expr2

  • expr1 || expr2

  • expr1 | expr2

  • expr1 ^ expr2

Die überladenen relationalen Operatoren ==, !=, >, <, >= und <= funktionieren nicht in C++:

  • expr1 == expr2

  • expr1 != expr2

  • expr1 > expr2

  • expr1 < expr2

  • expr1 >= expr2

  • expr1 <= expr2

Die überladenen Infixoperatoren |, ^, <<, >>, >, <, >= und <= funktionieren nicht:

  • expr1 | expr2

  • expr1 ^ expr2

  • expr1 << expr2

  • expr1 >> expr2

  • expr1 > expr2

  • expr1 < expr2

  • expr1 >= expr2

  • expr1 <= expr2

Die überladenen Präfixoperatoren +, -, ++, --, ! und ~ funktionieren:

  • + + expr1

  • - - expr1

  • ++ ++ expr1

  • -- -- expr1

  • ! expr1

  • ~ ~ expr1

Die überladenen Suffixoperatoren ++ und -- funktionieren:

  • expr1++

  • expr1--

Der überladene Operator [] funktioniert:

  • x[expr2]

Mehrdimensionale Arrays

Die C++-Ausdrucksauswertung verwendet Syntax im C#-Format für mehrdimensionale Arrays. Beispiel:

c[0,0]

Die Verwendung normaler C++-Syntax generiert einen Fehler:

c[0][0] Fehler: Index '0' nicht im zulässigen Bereich für Zeiger/Array 'c'

Zeichenfolgen

Der Debugger erkennt den indizierten Operator sowohl bei der Verwendung mit Zeichenfolgen als auch bei der Verwendung mit Arrays. Sie können also beispielsweise Folgendes eingeben:

"hello world"[0]

Im Fenster Überwachen wird der richtige Wert angezeigt:

'h'

Typumwandlungen

Einfache Typumwandlungsausdrücke funktionieren im Debugger:

(A)x

Typumwandlungen mit Zeigern funktionieren dagegen nicht:

Benutzerdefinierte Typumwandlungen funktionieren im Debugger für Visual C++ nicht.

Vergleich und Zuweisung von Objekten

Das Vergleichen und Zuweisen von Objekten im Debugger funktioniert nicht für Visual C++.

typeof-Operator und sizeof-Operator

Der Debugger unterstützt den typeof-Operator und den sizeof-Operator, indem er ihn jeweils in die entsprechende .NET Framework-Funktion umwandelt.

typeof ( expression )

wird umgewandelt in:

System.Type.GetType(expression )

Anschließend wertet der Debugger diesen umgewandelten Ausdruck aus.

Der sizeof-Operator wird vom Debugger nicht unterstützt.

Boxing und Unboxing

Boxing und Unboxing werden von der Ausdrucksauswertung des Debuggers in Visual C++ nicht unterstützt. Weitere Informationen hierzu finden Sie unter Boxing und Unboxing. Wenn eine ganzzahlige Variable i durch Boxing in ein Objekt konvertiert wurde, wertet der Debugger i als ganze Zahl (nicht als Objekt) aus. Die Ergebnisse entsprechen dann möglicherweise nicht Ihren Erwartungen. Weitere Informationen darüber, wie Werte durch Boxing beeinflusst werden, finden Sie unter Boxing-Konvertierung.

Eigenschaftenauswertung

Der Debugger kann in beliebigen Variablenfenstern Eigenschaften auswerten. Beim Auswerten von Eigenschaften im Debugger können jedoch Nebeneffekte auftreten, die unerwartete und unerwünschte Ergebnisse liefern. Sie können die Eigenschaftenauswertung im Dialogfeld Optionen deaktivieren, um eventuellen Nebeneffekten durch eine versehentliche Auswertung vorzubeugen.

WebMethods

WebMethods können nicht über ein Debuggerfenster aufgerufen werden.

Siehe auch

Weitere Ressourcen

Ausdrücke im Debugger