Výrazy v nativním kódu C++
Ladění přijímá většina výrazů Microsoft a ANSI C/C++.Ladicí program také poskytuje vnitřní funkce a kontextu operátory k vyhodnocení výrazů bezpečnější a pohodlnější.Toto téma také popisuje omezení na výrazech jazyka C++, které je třeba znát 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ý kód 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 určit symbol
Omezení nativní C++ výrazy
Řízení přístupu
Dvojznačný odkazy
Anonymní obory názvů
Konstruktory, destruktory a převody
Dědičnost
Vložená a kompilátor vnitřní funkce.
Číselné konstanty
Operátor funkce
Přetěžování
Priorita
Symbol formáty
Přetypování
Pomocí funkce intrinisic ladicí program k udržení stavu
Ladicí program vnitřní funkce umožňují volat některé funkce C/C++ ve výrazech beze změny stavu aplikace.
Vnitřní funkce ladicí program:
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.
Mohou všechny výrazy, i v situacích, kdy vedlejší účinky a vyhodnocení funkce nejsou povoleny.
Práce v případech, kde nejsou možné, například při ladění minidump normální funkce volání.
Vnitřní funkce ladicí program můžete také provést vyhodnocení výrazů pohodlnější.Například strncmp(str, “asd”) je mnohem snazší zarážku kondici 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 |
Hledání řetězce |
strchr, wcschr, strstr, wcsstr |
Win32 |
GetLastError(), TlsGetValue() |
Windows 8 |
WindowsGetStringLen(), WindowsGetStringRawBuffer() Tyto funkce vyžadují proces, který je právě laděn, 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 Pokud vzdáleně ladíte zařízení Windows 8, počítač Visual Studio může být spuštěn systém Windows 7. |
Různé |
__log2 Vrátí základní 2 zadané číslo zaokrouhleno na nejbližší nižší celé číslo protokolu. |
Použití operátorů kontextu určit 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 kontext pro získání umístění zarážky, proměnná nebo výraz.Operátor kontextu je užitečné pro účely určení názvu z vnějšího oboru, jinak skrytá pomocí místní název.
Syntax
{,,[module] } expression
moduleje název modulu.Úplnou cestu lze rozlišit mezi moduly se stejným názvem.
expressionje libovolný platný výraz jazyka C++, který se překládá na platným cílem, jako je například název funkce, proměnné název nebo adresu ukazatele v module.
Složené závorky musí obsahovat dvě čárky a modul (spustitelný soubor nebo DLL) název a úplnou cestu.
Chcete-li například nastavit zarážku na SomeFunction funkce EXAMPLE.dll:
{,,EXAMPLE.dll}SomeFunction
Pokud module cesta obsahuje čárku, vložené místo nebo složená závorka, je nutné použít uvozovky kolem cesty tak, aby analyzátor kontextu správně rozpozná řetězce.Jednoduché uvozovky jsou považovány za součást názvu souboru systému Windows, je nutné použít uvozovky.Příklad:
{,"a long, long, library name.dll", } g_Var
Při vyhodnocení výraz nalezne symbol ve výrazu, hledá symbol v následujícím pořadí:
Lexikální obor ven, počínaje aktuální blok, ř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í adresu ukazatele instrukce.
Obor funkce.Aktuální funkce.
Rozsahu třídy, pokud je aktuální umístění uvnitř členské funkce jazyka C++.Třída obor obsahuje všechny základní třídy.Vyhodnocení výrazu používá pravidla normálního dominantního postavení.
Globální symboly do aktuálního modulu.
Veřejné symboly v aktuálním programu.
Operátor kontextu určit výchozí modul vyhledávání a obejít aktuální umístění.
Omezení nativní C++ výrazy
Pokud zadáte výraz C/C++ v okně debugger, 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.Každý člen třídy objektu, včetně základní třídy a objekty vložené členů můžete zkoumat.
Dvojznačný odkazy
Pokud ladicí program výraz odkazuje název členu nejednoznačný, musí nelze přistupovat pomocí názvu třídy.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ý.Lze vyřešit nejednoznačnosti následujícím způsobem:
CObject.BClass::expense
Chcete-li vyřešit nejasnosti, vyhodnocení výrazu platí dominance normální pravidla pro 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, destruktory a převody
Nelze volat konstruktor a destruktor objektu, buď explicitně nebo implicitně, pomocí výrazu, který volá stavbu dočasných objektů.Následující výraz například explicitně volání konstruktoru a výsledkem je chybová zpráva:
Date( 2, 3, 1985 )
Funkce převodu nelze volat, pokud je cíl převodu třídy.Taková přeměna zahrnuje konstrukci objektu.Například pokud myFraction je CFraction, která definuje funkci operátor převodu FixedPoint, následující výraz způsobí chybu:
(FixedPoint)myFraction
Pokud je cíl převodu předdefinovaný typ však můžete volat funkce převodu.Pokud CFraction definuje funkce převodu operator float, je legální v ladicím programu následující výraz:
(float)myFraction
Můžete volat funkce, které vracejí objekt nebo deklarovat místní objekty.
Nelze volat new nebo delete operátory.Následující výraz není funkční v debuggeru:
new Date(2,3,1985)
Dědičnost
Při použití ladicího programu 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žena pouze jedna instance těchto členů.
Volání virtuální funkce jsou správně zpracovávány vyhodnocení výrazu.Předpokládejme například, třída CEmployee definuje virtuální funkce computePay, který předefinuje ve třídě, která dědí z CEmployee.Můžete volat computePay prostřednictvím ukazatele na CEmployee a správnou funkci spustit:
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.
Vložená a kompilátor vnitřní funkce.
Výraz ladicí program nelze volat kompilátoru vnitřní funkce nebo vložená funkce Pokud funkce zobrazí alespoň jednou jako normální funkce.
Číselné konstanty
Ladicí program výrazů pomocí celočíselné konstanty v osmičkové, šestnáctkovém nebo desítkovém formátu.Podle výchozího nastavení ladicího programu očekává desítkové konstanty.Toto nastavení lze změnit na Obecné stránka ladění kartu.
Předpona nebo přípona symboly lze znázornit čísla v jiném base.Následující tabulka zobrazuje formuláře, které můžete použít.
Syntax |
Příklad (desítkové číslo 100) |
Base |
---|---|---|
digits |
100 nebo 64 |
Desítkové nebo šestnáctkové, v závislosti na aktuální nastavení. |
0digits |
0144 |
Octal (základ 8) |
0ndigits |
0n100 |
Desítkové (základ 10) |
0xdigits |
0x64 |
Šestnáctkové (základ 16) |
digitsh |
64h |
Šestnáctkové (základ 16) |
Operátor funkce
Výraz ladicí program může vyvolat operátor funkce třídy implicitně nebo explicitně.Předpokládejme například, myFraction a yourFraction jsou instance 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 zavolat implicitně používat stejnou syntaxi jako členské funkce nebo je můžete 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í konstrukci objektu.
Ladicí program nepodporuje přetížené operátory s konstantní a non-const verze.Přetížené operátory s konstantní a non-const verze se často používají v knihovně Standard Template Library.
Přetěžování
Výrazu ladicí program můžete volat přetížené funkce, pokud existuje přesná shoda nebo shoda nevyžaduje, aby převod zahrnující vytváření objektů.Například pokud calc funkce bere CFraction objekt jako parametr a CFraction třída definuje jeden 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řepočet zahrnuje vytvoření objektu a není podporován.
Priorita
Ve výrazech ladicí program C++ oboru operátor (::) má nižší prioritu než zdrojový kód.Tento operátor ve zdrojovém kódu jazyka C++, má nejvyšší prioritu.V ladicím programu, jeho přednost patří mezi základní a Příponové operátory (->, ++, --) a unární operátory (!, &, *a další).
Symbol formáty
Zadejte výraz ladicí program, který obsahuje symboly ve stejné podobě použité ve zdrojovém kódu za předpokladu, jsou symboly v modul kompilována 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 moduly zkompilovány s /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 (Formát informací o ladění).
Můžete získat seznam všech názvů dekorované a upraveného formuláře pomocí možnosti/LINK map.Další informace naleznete v tématu /map (Generovat Mapfile).
Úprava názvu je mechanismus, který se používá k vynucení propojení zajišťující bezpečnost typů.To znamená, že názvy a odkazy s přesně odpovídající kontroly pravopisu, případ, konvence volání a typ jsou propojeny.
Názvy deklarované pomocí konvence volání, implicitně nebo explicitně pomocí C _cdecl klíčové slovo, které začínají podtržítkem ( _ ).Například funkce main může být zobrazen jako _main.Názvy deklarován jako _fastcall začínají @ symbol.
Upravený název jazyka C++, kóduje typ symbolu kromě konvence volání.Tato forma názvu mohou být dlouhé a obtížné číst.Název začíná alespoň jeden otazník (?).Dekorační funkcí jazyka C++ zahrnuje rozsah funkce, typy parametrů funkce a návratový typ funkce.
Přetypování
Pokud je přetypována na typ typ musí být známa s ladicí program.V programu musí mít jiný objekt daného typu.Typy vytvořené pomocí typedef příkazy nejsou podporovány.