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
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++. –
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
Poza tym, że wiele kompilatorów C i C++ zezwala na '$' w identyfikatorach jako rozszerzenie. –