2014-10-08 14 views
5

Mam następujący kod C++ skompilowany do Program.exe użyciu vs12jakie są symbole grawis w vs trybie użytkownika debugger

class foo 
{ 
public: 
    foo() 
    { 
     std::cout << "in ctor\n"; 
    } 

    ~foo() 
    { 
     std::cout << "in dtor\n"; 
    } 

    std::string s; 
}; 

int main() 
{ 
    foo f{}; 
} 

Potem idę do „Tools->Launch Under Debugger...” i wpisz następujące polecenie w debuggera natychmiastowej oknie

x program!*foo* 

To daje mi następujący wynik

0:000> x program!*foo* 
00007ff6`11ce4b00 Program!foo::~foo (void) 
00007ff6`11ceaef0 Program!`foo::~foo'::`1'::dtor$0 (void) 
00007ff6`11ce48f0 Program!foo::foo (void) 
00007ff6`11ceae90 Program!`foo::foo'::`1'::dtor$0 (void) 

Rozumiem, że pierwszym wyjściem jest destruktor foo, a trzecim jest konstruktor foo. Co to jest drugi i czwarty (te z backticks)?. Bardziej ogólnie, jakie są inne miejsca, w których mogę zobaczyć backticks w debugerze trybu użytkownika?

ciekawe funkcje grawis odejść, jeśli którykolwiek z następujących czynności są wykonywane

  • Usuń std::cout oświadczenia
  • Usuń std::string s
  • Dodaj słowa kluczowego throw() przed konstruktora i destruktora

Wydaje się to sugerować, że funkcje backtick mają coś wspólnego z obsługą wyjątków

Odpowiedz

2

Są to wewnętrzne nazwy wygenerowane przez kompilator Microsoft dla funkcji "klejenia", które pomagają dopasowywać elementy do siebie, ale nie odpowiadają bezpośrednio linii kodu źródłowego. To normalne.

Istnieją inne sytuacje, w których podobne wewnętrzne nazwy będą wyświetlane za pomocą odsunięć, takich jak używanie funkcji lambda lub wywoływanie funkcji zadeklarowanej wewnątrz struktury znajdującej się w innej funkcji.

Inne kompilatory mają różne sposoby reprezentowania podobnych bezimiennych bloków kodu; standard nie dyktuje tutaj żadnego szczególnego zachowania, i to jest możliwe do zaobserwowania tylko przez debugger.

+1

Prawdopodobnie wybrano backtick, ponieważ nie jest on używany w C++, więc nie można go pomylić z żadną konstrukcją z kodu źródłowego C++. –

+0

Zdecydowanie. Oczywiście istnieje wiele symboli do wyboru, które pasują do tego profilu. W rzeczywistości 'dtor $ 0' używa' $ 'tylko dlatego, że jest poza zakresem legalnych znaków. – StilesCrisis

+0

Poza tym, że wiele kompilatorów C i C++ zezwala na '$' w identyfikatorach jako rozszerzenie. –

Powiązane problemy