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í:
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.
Obor funkce.Aktuální funkce.
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í.
Globální symboly v aktuálním modulu.
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í:
Ří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ů.
Dvojznač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ů.
Anonymní 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
Konstruktory 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)
Dě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.
Inlined 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.
Čí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) |
Operá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.
Př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.
Priorita
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ší).
Formá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.
Př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.