Udostępnij za pośrednictwem


Wyrażenia w macierzystym C++

Debuger akceptuje wyrażenia większości firmy Microsoft i ANSI C/C++.Zapewnia także debugera Funkcje i operatorów kontekst aby ocenę wyrażeń, bezpieczniejsze i wygodniejsze.W tym temacie opisano na wyrażeniach języka C++, które należy zwrócić uwagę na następujące ograniczenia:

Nie można użyć operatora kontekstu lub większości specyfikatory formatu w kodzie lub przy użyciu skryptu lub zarządzany kod wyrażeń.Są one specyficzne dla modułu szacującego macierzystym C++.

W tej sekcji

Przy użyciu funkcji intrinisic debugera, aby utrzymać stan

Za pomocą operatorów kontekstu, aby określić symbol

Ograniczenia dotyczące wyrażeń macierzystym C++

  • Kontrola dostępu

  • Niejednoznacznych odwołań

  • Anonimowe przestrzenie nazw

  • Konstruktory i destruktory, a konwersje

  • Dziedziczenie

  • Funkcje Wplatany i kompilatora

  • Stałe numeryczne

  • Operator funkcji

  • Przeciążenie

  • Pierwszeństwo

  • Formatów symboli

  • Typ rzutowania

Przy użyciu funkcji intrinisic debugera, aby utrzymać stan

Funkcje debugera daje sposobem na połączenie niektórych funkcji C/C++ w wyrażeniach, bez zmiany stanu aplikacji.

Funkcje debugera:

  • Gwarancja bezpiecznych: wykonywanie wewnętrzna funkcja debuger nie zniszczy proces, który jest debugowany.

  • Są dozwolone w wszystkie wyrażenia, nawet w scenariuszach, w którym skutki uboczne i wartości funkcji nie są dozwolone.

  • Praca w scenariuszach, w którym wywołań funkcji regularnych nie są możliwe, na przykład przy debugowaniu mini-zrzut.

Funkcje debugera można także wprowadzić ocenę wyrażenia wygodniejsze.Na przykład strncmp(str, “asd”) jest znacznie ułatwia pisanie w stanie przerwania niż str[0] == ‘a’ && str[1] == ‘s’ && str[2] == ‘d’.)

Obszar

Funkcje

Długość ciągu

strlen, wcslen, strnlen, wcsnlen

Porównania ciągów

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

Wyszukiwanie ciągu

strchr, wcschr, strstr, wcsstr

Win32

GetLastError(), TlsGetValue()

Windows 8

WindowsGetStringLen(), WindowsGetStringRawBuffer()

Funkcje te wymagają proces, który jest debugowany uruchomiony przez Windows 8.Debugowanie pliki zrzutu, wygenerowana przez urządzenie Windows 8 również wymaga, aby komputer Visual Studio działa Windows 8.Jednakże jeśli zdalnie debugowania urządzenia Windows 8 komputerze Visual Studio może być uruchomiony system Windows 7.

Różne

__log2

Zwraca dziennika o podstawie 2 określona liczba całkowita, zaokrąglona do najbliższej liczby całkowitej w dolnym.

Za pomocą operatorów kontekstu, aby określić symbol

Operator kontekstu jest operator dodatkowe dostarczane przez macierzysty debugera.Podczas debugowania kodu macierzystego, można użyć operatora kontekstu Aby zakwalifikować się do lokalizacji punkt przerwania, nazwa zmiennej lub wyrażenia.Operator kontekstu jest przydatna do celów, takich jak określanie nazwę z zewnętrznym zakresie, w przeciwnym razie ukryte na skutek nazwę lokalną.

Składnia

{,,module} wyrażenie

  • Moduł jest nazwą modułu.Pełna ścieżka można użyć, aby odróżnić między modułami o tej samej nazwie.

  • wyrażenie jest dowolnym prawidłowym wyrażeniem C++, która jest rozpoznawana jako prawidłowe miejsce docelowe nazwę funkcji, nazwy zmiennej lub adres wskaźnika w moduł.

Nawiasy klamrowe muszą zawierać dwa przecinki, a moduł (pliku wykonywalnego lub DLL) nazwa lub Pełna ścieżka.

Na przykład, aby ustawić punkt przerwania na SomeFunction funkcji EXAMPLE.dll:

{,,EXAMPLE.dll}SomeFunction

Jeśli moduł ścieżka zawiera przecinek, nazwie spację lub nawias, należy użyć ścieżki w cudzysłowie, analizator składni kontekstu prawidłowo rozpoznać ciąg.Pojedyncze cudzysłowy są traktowane jako część nazwę pliku systemu Windows, trzeba używać podwójny cudzysłów.Na przykład:

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

Gdy szacującego napotka symbol w wyrażeniu, wyszukuje symbol w następującej kolejności:

  1. Zakres leksykalny na zewnątrz, począwszy od bieżącego bloku, szereg instrukcje zawarte w nawiasach i kolejno na zewnątrz otaczającym bloku.Bieżącego bloku jest kod zawierający bieżącą lokalizację, adres wskaźnik instrukcji.

  2. Zakres funkcji.Bieżącą funkcję.

  3. Zakres klasy, jeśli bieżąca lokalizacja znajduje się wewnątrz funkcji składowej języka C++.Zakres klasy zawiera wszystkie klasy podstawowej.Tester wyrażenie stosowane są reguły normalnej pozycji dominującej.

  4. Globalne symbole w bieżącego modułu.

  5. Publiczne symbole w bieżącym programie.

Za pomocą operatora kontekstu Określ początkową moduł wyszukiwania i pominąć bieżącą lokalizację.

Ograniczenia dotyczące wyrażeń macierzystym C++

Po wprowadzeniu wyrażenia C/C++ w oknie Debuger obowiązują te ogólne ograniczenia:

y2t7ahxk.collapse_all(pl-pl,VS.110).gifKontrola dostępu

Debuger można uzyskać dostęp do wszystkich członków klasy niezależnie od tego, kontroli dostępu.Można sprawdzić każdy członek obiektu klasy, w tym podstawowych klas i obiektów osadzonych.

y2t7ahxk.collapse_all(pl-pl,VS.110).gifNiejednoznacznych odwołań

Jeśli wyrażenie debuger odwołuje się do nazwa członka niejednoznaczne, należy użyć nazwy klasy, aby zakwalifikować go.Na przykład jeśli CObject jest wystąpieniem CClass, która dziedziczy funkcji element członkowski o nazwie expense z obu AClass i BClass, CObject.expense jest niejednoznaczna.Można usunąć niejasności w następujący sposób:

CObject.BClass::expense

Aby rozwiązać niejasności, Tester wyrażenie stosuje reguły normalnej pozycji dominującej dotyczących nazwy składników.

y2t7ahxk.collapse_all(pl-pl,VS.110).gifAnonimowe przestrzenie nazw

Macierzystym C++ szacującego nie obsługuje anonimowe obszarów nazw.Załóżmy, na przykład, poniższy kod:

#include "stdafx.h"

namespace mars 
{ 
    namespace
    {
        int test = 0; 
    } 

} 


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

Jedynym sposobem, aby obejrzeć symbol test w tym przykładzie jest skorzystanie z dekoracyjną nazwę:

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

y2t7ahxk.collapse_all(pl-pl,VS.110).gifKonstruktory i destruktory, a konwersje

Nie można wywołać konstruktora i destruktora w przypadku obiektu jawnie lub niejawnie za pomocą wyrażenia, który wzywa do budowy tymczasowy obiekt.Na przykład następujące wyrażenie jawnie wywołuje konstruktor i powoduje wyświetlenie komunikatu o błędzie:

Date( 2, 3, 1985 )

Nie można wywołać funkcji konwersji, jeżeli miejsce przeznaczenia konwersji jest klasą.Takie przekształcenie polega na budowie obiektu.Na przykład jeśli myFraction jest wystąpieniem CFraction, która definiuje operator funkcji konwersji FixedPoint, następujące wyrażenie powoduje wystąpienie błędu:

(FixedPoint)myFraction

Jednakże można wywołać funkcję konwersji, jeśli obiekt docelowy konwersji jest typem wbudowanym.Jeśli CFraction definiuje funkcję konwersji operator float, następujące wyrażenie jest dozwolony w debugerze:

(float)myFraction

Może wywoływać funkcje, które zwracają obiekt lub zadeklarować obiektów lokalnych.

Nie można wywołać funkcji new lub delete podmiotów gospodarczych.Następujące wyrażenie nie działa w debugerze:

new Date(2,3,1985)

y2t7ahxk.collapse_all(pl-pl,VS.110).gifDziedziczenie

Debuger umożliwia wyświetlanie klasy obiekt, który posiada wirtualnych klas bazowych, Członkowie wirtualnego klasy podstawowej są wyświetlane dla każdej ścieżki dziedziczenia, nawet jeśli tylko jedno wystąpienie tych członków jest przechowywany.

Wywołań funkcji wirtualnych są poprawnie obsługiwane przez tester wyrażenie.Załóżmy na przykład, klasa CEmployee definiuje funkcję wirtualną computePay, który jest ponownie zdefiniować w klasie, która dziedziczy z CEmployee.Można wywołać computePay za pomocą wskaźnika do CEmployee i posiada funkcję właściwego wykonywane:

empPtr->computePay()

Wskaźnik do obiektu tej klasy mogą być rzutowane na wskaźnik do obiektu klasy podstawowej.Wskaźnik do obiektu klasy podstawowej mogą rzutowane na wskaźnik do obiektu tej klasy, z wyjątkiem przypadków gdy dziedziczenie jest wirtualna.

y2t7ahxk.collapse_all(pl-pl,VS.110).gifFunkcje Wplatany i kompilatora

Wyrażenie debuger nie można wywołać kompilator, funkcje lub inlined działa, jeśli funkcja pojawi się co najmniej raz w normalnej funkcji.

y2t7ahxk.collapse_all(pl-pl,VS.110).gifStałe numeryczne

Stałe będące liczbami całkowitymi można użyć wyrażenia debugera w formacie ósemkową, szesnastkową lub dziesiętną.Domyślnie Debuger oczekuje decimal stałych.To ustawienie można zmienić na Ogólne strona Debugging kartę.

Prefiks lub sufiks symbole służy do wyświetlania liczb w innej bazie.W poniższej tabeli przedstawiono formularze, których można użyć.

Składnia

Przykład (liczbę dziesiętną 100)

Podstawy

cyfry

100 lub 64

Dziesiętną lub szesnastkową, w zależności od bieżącego ustawienia.

0cyfry

0144

Ósemkowej (podstawa 8)

0ncyfry

0n100

Dziesiętny (podstawa 10)

0xcyfry

0x64

Szesnastkowy (podstawa 16)

cyfryh

64 h

Szesnastkowy (podstawa 16)

y2t7ahxk.collapse_all(pl-pl,VS.110).gifOperator funkcji

Wyrażenie debuger mogą wywoływać funkcje operatora dla klasy, jawnie lub niejawnie.Załóżmy na przykład, myFraction i yourFraction są instancjami klasy, która definiuje operator+.Można wyświetlić sumę tych dwóch obiektów za pomocą następującego wyrażenia:

myFraction + yourFraction

Jeśli funkcję operatora jest zdefiniowana jako znajomego, można wywołać ją domyślnie przy użyciu tej samej składni, jak w przypadku funkcji składowej, lub można go wywołać, jawnie w następujący:

operator+( myFraction, yourFraction )

Jak zwykłych funkcji funkcji operatora nie można wywołać z argumentami, które wymagają konwersji z udziałem konstrukcji obiektów.

Debuger nie obsługuje przeciążonych operatorów z wersji const i nie const.Przeciążonych operatorów z wersji const i nie const są często stosowane w bibliotekę STL.

y2t7ahxk.collapse_all(pl-pl,VS.110).gifPrzeciążenie

Wyrażenie debuger może wywoływać funkcje przeciążony, jeśli istnieje dokładne dopasowanie, lub jeśli mecz wymaga konwersji z udziałem konstrukcji obiektów.Na przykład jeśli calc funkcja ma CFraction obiekt jako parametr i CFraction klasa definiuje Konstruktor pojedynczy argument, który przyjmuje liczbą całkowitą, następujące wyrażenie powoduje błąd:

calc( 23 )

Mimo, że istnieje prawne konwersji do konwersji wartości całkowitej w CFraction obiekt, który calc oczekuje, takie przeliczenie zakłada stworzenie obiektu i nie jest obsługiwana.

y2t7ahxk.collapse_all(pl-pl,VS.110).gifPierwszeństwo

W wyrażeniach debuger C++ zakres operator (::) ma niższy priorytet niż ma to miejsce w kodzie źródłowym.W kodzie źródłowym C++ tego operatora, ma najwyższy priorytet.W debugerze, pierwszeństwo przed przypada między base i przyrostkowe operatory (->, ++, --) i operatory jednoargumentowe (!, &, *i inne).

y2t7ahxk.collapse_all(pl-pl,VS.110).gifFormatów symboli

Wprowadź wyrażenie debugera, które zawiera symbole w tej samej formie, używane w kodzie źródłowym, pod warunkiem, że symbole są w module skompilowane z uwzględnieniem informacji debugowania pełnego (/Zi lub /ZI).Jeśli wprowadzisz wyrażenie, które zawiera symbole publiczne, którego symbole znajdują się w bibliotekach lub w modułach skompilowane z /Zd, należy kliknąć nazwę dekoracyjną symbolu, formularz używany w kodzie obiekt.Aby uzyskać więcej informacji, zobacz /Z7, /Zd, /Zi, /ZI (Format informacji debugowania).

Znajduje się lista wszystkich nazw można uzyskać z dekoracyjną i bez informacji systemu NT formularzy przy użyciu opcji/LINK map.Aby uzyskać więcej informacji, zobacz /map (Generuj argument Mapfile).

Przekręcenie nazwy jest mechanizm używany w celu wymuszenia powiązania typu palety.Oznacza to, że tylko nazwy i odwołania z dokładnie pasujące sprawdzanie pisowni, sprawy, konwencja wywołania i typ są połączone ze sobą.

Nazwy zadeklarowana z C konwencji wywoływania, pośrednio lub bezpośrednio za pomocą _cdecl słowa kluczowego, rozpoczyna się od znaku podkreślenia ( _ ).Na przykład funkcja main mogą być wyświetlane jako _main.Nazwy zadeklarowany jako _fastcall zaczynają się od @ symbol.

Dla języka C++ nazwę dekoracyjną koduje typ symbolu oprócz konwencję wywołania.Ten formularz o tej nazwie może być długa i trudne do odczytania.Nazwa zaczyna się od co najmniej jeden znak zapytania (?).Do funkcji języka C++ dekoracji zawiera zakres funkcji, rodzaje parametry funkcji i zwracany typ funkcji.

y2t7ahxk.collapse_all(pl-pl,VS.110).gifTyp rzutowania

Jeśli Rzutowanie na typ, typ musi być znana do debugera.Musisz mieć inny obiekt tego typu w programie.Typy utworzone za pomocą typedef instrukcje nie są obsługiwane.