Sdílet prostřednictvím


Výrazy v nativním jazyce C++

Ladicí program přijímá většina společností Microsoft a ANSI C/C++ výrazy.Ladicí program také poskytuje vnitřní funkce a kontextu operátorů tak, aby hodnocení výrazů, bezpečnější a pohodlnější.Toto téma také popisuje omezení v C++ výrazy, které je třeba si uvědomit následující:

Nelze použít operátor kontextu nebo většina specifikátorů formátu v kódu nebo pomocí skriptu nebo spravovaného kódu výrazy.Jsou specifická pro nativní vyhodnocení výrazu jazyka C++.

V této části

Pomocí funkce intrinisic ladicí program k udržení stavu

Použití operátorů kontextu zadat symbol

Omezení na nativní C++ výrazy

  • Řízení přístupu

  • Dvojznačný odkazy

  • Anonymní obory názvů

  • Konstruktory a destruktory převody

  • Dědičnost

  • Inlined a kompilátor vnitřní funkce.

  • Číselné konstanty

  • Operátor funkce

  • Přetěžování

  • Priorita

  • Formáty

  • Přetypování typů

Pomocí funkce intrinisic ladicí program k udržení stavu

Ladicí program vnitřní funkce umožňují volat určitých funkcí C/C++ ve výrazech beze změny stavu aplikace.

Ladicí program vnitřní funkce:

  • Jsou zaručeny bezpečné: spuštění ladicího programu vnitřní funkce nesmí dojít k poškození proces, který je právě laděn.

  • Jsou povoleny ve všech výrazech, dokonce i v situacích, kde nejsou povoleny vedlejší účinky a vyhodnocení funkce.

  • Práce v situacích, kde je možné, například při ladění minidump normální funkce volání.

Vnitřní funkce ladicí program můžete také provést hodnocení výrazů pohodlnější.Například strncmp(str, “asd”) je mnohem snazší psát v podmínce zarážku než str[0] == ‘a’ && str[1] == ‘s’ && str[2] == ‘d’.)

Oblast

Vnitřní funkce

Délka řetězce

strlen, wcslen, strnlen, wcsnlen

Porovnání řetězců

strcmp, wcscmp, stricmp, _stricmp, _strcmpi, wcsicmp, _wcscmpi, _wcsnicmp, strncmp, wcsncmp, strnicmp, wcsnicmp

Vyhledávací řetězec

strchr, wcschr, strstr, wcsstr

Win32

GetLastError(), TlsGetValue()

Windows 8

WindowsGetStringLen(), WindowsGetStringRawBuffer()

Tyto funkce vyžadují proces, který je právě laděna, aby byla spuštěna v systému Windows 8.Ladění souborů s výpisem stavu paměti generován z Windows 8 zařízení také vyžaduje, aby aplikace Visual Studio počítače systémem Windows 8.Však je-li zařízení Windows 8 jsou vzdálené ladění, Visual Studio může být v počítači systém Windows 7.

Různé

__log2

Vrátí základ 2 zadané celé číslo, zaokrouhlí na nejbližší nižší celé číslo v protokolu.

Použití operátorů kontextu zadat symbol

Operátor kontextu je další operátor poskytuje nativní ladicí program.Při ladění nativního kódu, můžete použít operátor kontextu vymezující umístění zarážky, název proměnné nebo výrazu.Operátor kontextu je užitečná pro účely určení názvu z vnější obor, který je jinak skryté pomocí místní název.

Syntaxe

{,,module} výraz

  • modul je název modulu.Můžete použít úplnou cestu k rozlišit mezi moduly se stejným názvem.

  • výraz je libovolný platný výraz jazyka C++, který se překládá na platný cíl, například název funkce, proměnné název nebo adresu ukazatele v modulu.

Složené závorky musí obsahovat dvě čárky a modul (spustitelného souboru nebo knihovna DLL) název nebo úplnou cestu.

Chcete-li nastavit zarážku na například SomeFunction funkce EXAMPLE.dll:

{,,EXAMPLE.dll}SomeFunction

Pokud modulu cesta obsahuje čárku, vložené mezery nebo složená závorka, aby analyzátor kontext správně rozpoznal řetězec, je nutné použít uvozovky kolem cesty.Jednoduché uvozovky jsou považovány za součást názvu souboru systému Windows, takže je nutné použít uvozovky.Příklad:

{,"a long, long, library name.dll", } g_Var

Při vyhodnocení výrazu zaznamená symbol ve výrazu, hledá symbol v následujícím pořadí:

  1. Lexikální rozsah směrem ven, počínaje aktuálním bloku řada příkazů uzavřeny ve složených závorkách a pokračovat směrem ven vnějšího bloku.Je aktuální blok kódu, který obsahuje aktuální umístění ukazatele adresu instrukce.

  2. Obor funkce.Aktuální funkce.

  3. Rozsahu třídy, pokud je aktuální umístění uvnitř členskou funkci jazyka C++.Třída obor obsahuje všechny základní třídy.Vyhodnocení výrazu používá pravidla normální dominantního postavení.

  4. Globální symboly v aktuálním modulu.

  5. Veřejné symboly v aktuální aplikaci.

S operátorem kontextu určit počáteční modul vyhledávání a obejít aktuální umístění.

Omezení na nativní C++ výrazy

Zadáte-li výraz C/C++ v okně ladicí program, platí tyto obecné omezení:

y2t7ahxk.collapse_all(cs-cz,VS.110).gifŘízení přístupu

Ladicí program můžete získat přístup k všechny členy třídy bez ohledu na řízení přístupu.Můžete zkontrolovat každý člen třídy objektu, včetně základní třídy a objekty vložené členů.

y2t7ahxk.collapse_all(cs-cz,VS.110).gifDvojznačný odkazy

Pokud ladicí program výraz odkazuje na nejednoznačné člen název, je nutné použít název třídy ji využívat.Například pokud CObject je instancí třídy CClass, který dědí členské funkce s názvem expense z obou AClass a BClass, CObject.expense je dvojznačný.Můžete vyřešení nejednoznačnosti následujícím způsobem:

CObject.BClass::expense

Chcete-li vyřešit nejasnosti, vyhodnocení výrazu platí normální dominantního postavení pravidla týkající se názvy členů.

y2t7ahxk.collapse_all(cs-cz,VS.110).gifAnonymní obory názvů

Nativní vyhodnocení výrazu C++ nepodporuje anonymní obory názvů.Předpokládejme například, že máte následující kód:

#include "stdafx.h"

namespace mars 
{ 
    namespace
    {
        int test = 0; 
    } 

} 


int main() 
{ 
    // Adding a watch on test does not work. 
    mars::test++; 
    return 0; 
} 

Jediný způsob, jak sledovat symbol test v tomto příkladu je pomocí dekorovaný název:

(int*)?test@?A0xccd06570@mars@@3HA

y2t7ahxk.collapse_all(cs-cz,VS.110).gifKonstruktory a destruktory převody

Nelze volat konstruktor nebo destruktoru objektu, buď explicitně nebo implicitně, pomocí výrazu, který volá pro konstrukci dočasný objekt.Následující výraz například explicitně volá konstruktor a výsledkem je chybová zpráva:

Date( 2, 3, 1985 )

Je-li cílem převod třídy, nelze volat funkci pro převod.Taková přeměna zahrnuje konstrukci objektu.Například pokud myFraction je instancí třídy CFraction, která definuje funkci operátor převodu FixedPoint, následující výraz způsobí chybu:

(FixedPoint)myFraction

Je-li cílem převod předdefinovaný typ, však můžete volat funkci pro převod.Pokud CFraction definuje funkci pro převod operator float, je legální v ladicím programu následující výraz:

(float)myFraction

Chcete-li volat funkce, které vracejí objekt nebo deklarovat místní objekty.

Nelze volat new nebo delete operátory.Následující výraz nepracuje v debuggeru:

new Date(2,3,1985)

y2t7ahxk.collapse_all(cs-cz,VS.110).gifDědičnost

Při použití ladicího nástroje k zobrazení objektu třídy, která má virtuální základní třídy členy virtuální základní třídy jsou zobrazeny pro každou cestu dědičnosti, přestože je uložen pouze jeden výskyt těchto členů.

Volání virtuální funkce jsou správně zpracována vyhodnocení výrazu.Předpokládejme například, třída CEmployee definuje virtuální funkce computePay, který předefinuje do třídy, která dědí z CEmployee.Můžete zavolat computePay prostřednictvím ukazatele na CEmployee a správnou funkci provedeny:

empPtr->computePay()

Ukazatel na objekt odvozené třídy lze přetypovat na ukazatel na objekt základní třídy.Ukazatel na objekt základní třídy můžete obsadit do ukazatel na objekt odvozené třídy s výjimkou po virtuální dědičnost.

y2t7ahxk.collapse_all(cs-cz,VS.110).gifInlined a kompilátor vnitřní funkce.

Výraz ladicí program nelze volat kompilátor vnitřní funkce nebo vložená funkce, není-li funkce se zobrazí alespoň jednou jako normální funkce.

y2t7ahxk.collapse_all(cs-cz,VS.110).gifČíselné konstanty

V osmičkové, šestnáctkovém nebo desítkovém formátu, můžete použít ladicí program výrazy celočíselné konstanty.Ve výchozím nastavení ladicí program očekává desítkové konstanty.Toto nastavení lze změnit na Obecné stránku ladění kartu.

Předpona nebo přípona symboly můžete použít k vyjádření čísla v jiné základní.Následující tabulka zobrazuje formuláře, které můžete použít.

Syntaxe

Příklad (desítkové číslo 100)

Základní

číslice

100 nebo 64

Desítkové nebo šestnáctkové, v závislosti na aktuální nastavení.

0číslice

0144

Octal (základ 8)

0nčíslice

0n100

Desítkové (základ 10)

0xčíslice

0x64

Šestnáctkové (základ 16)

čísliceh

64 h

Šestnáctkové (základ 16)

y2t7ahxk.collapse_all(cs-cz,VS.110).gifOperátor funkce

Výraz ladicí program můžete vyvolat funkce operátor pro třídu, implicitně nebo explicitně.Předpokládejme například, že myFraction a yourFraction jsou instancemi třídy, která definuje operator+.Je možné zobrazit součet těchto dvou objektů pomocí následujícího výrazu:

myFraction + yourFraction

Pokud operátor funkce je definována jako přítele, můžete volat funkci, která implicitně používat stejnou syntaxi jako členskou funkci nebo je možné vyvolat explicitně, takto:

operator+( myFraction, yourFraction )

Podobně jako běžné funkce nelze volat operátor funkce s argumenty, které vyžadují převod zahrnující vytváření objektů.

Ladicí program nepodporuje přetížené operátory s const i bez const verze.Přetížené operátory s konstantní a jiných const verze se často používají v knihovny standardních šablon.

y2t7ahxk.collapse_all(cs-cz,VS.110).gifPřetěžování

Výraz ladicí program můžete volat přetížené funkce, pokud existuje přesná shoda nebo odpovídající nevyžaduje převod zahrnující vytváření objektů.Například pokud calc funkce přijímá CFraction objekt jako parametr a CFraction třída definuje jediný argument konstruktoru, který přijímá integer následující výraz způsobí chybu:

calc( 23 )

I když existuje právní převod převést na celé číslo do CFraction objekt, který calc očekává takový převod je vytvoření objektu a není podporován.

y2t7ahxk.collapse_all(cs-cz,VS.110).gifPriorita

Ve výrazech ladicí program v jazyce C++ oboru operátor (::) má nižší prioritu než ve zdrojovém kódu.Tento operátor ve zdrojovém kódu jazyka C++, má nejvyšší prioritu.V ladicím programu, jeho priorita patří mezi základní a Příponové operátory (->, ++, --) a unární operátory (!, &, *a další).

y2t7ahxk.collapse_all(cs-cz,VS.110).gifFormáty

Zadejte výraz ladicí program, který obsahuje symboly ve stejné podobě, které jsou použity ve zdrojovém kódu, pokud jsou symboly v modulu kompilovaný s úplné ladicí informace (/Zi nebo /ZI).Pokud zadáte výraz, který obsahuje veřejné symboly, které jsou symboly nalezen v knihovnách nebo v kompilované s moduly /Zd, je nutné použít upravený název symbolu, formulář použít v kódu objektu.Další informace naleznete v tématu /Z7, /Zd, /Zi, /ZI (Debug Information Format).

Můžete získat seznam všech názvů dekorované a upraveného formuláře pomocí možnosti/propojení map.Další informace naleznete v tématu /map (generovat Mapfile).

Úprava názvu je mechanismus použit k vytvoření propojení zajišťující bezpečnost typů.To znamená, navzájem propojeny pouze názvy a odkazy, které se přesně odpovídající kontroly pravopisu, případ, konvence volání a typem.

Názvy deklarována s C konvence volání, implicitně nebo explicitně pomocí _cdecl klíčové slovo, které začínají podtržítkem ( _ ).Například funkce main mohou být zobrazeny jako _main.Názvy deklarován jako _fastcall začínají @ symbol.

Upravený název jazyka C++, kóduje typ symbolu kromě konvence volání.Tento formulář název může být dlouhý a obtížně čitelné.Název začíná alespoň jeden otazník (?).U funkcí jazyka C++ ozdobný prvek obsahuje rozsahu funkce, typy parametrů funkce a návratový typ funkce.

y2t7ahxk.collapse_all(cs-cz,VS.110).gifPřetypování typů

Pokud přetypovat na typ, typ musí být známa ladicí program.V programu musí mít jiný objekt tohoto typu.Typy, které jsou vytvořeny pomocí typedef příkazy nejsou podporovány.