2014-10-08 6 views
5

ich folgender C++ Code in Program.exe mit VS12was die Graviszeichen Symbole in vs Benutzermodus-Debugger sind

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

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

    std::string s; 
}; 

int main() 
{ 
    foo f{}; 
} 

Dann gehe ich zusammengestellt haben „Tools->Launch Under Debugger...“ und den folgenden Befehl in dem sofortigen Fenster Debugger Typen

x program!*foo* 

das gibt mir die folgende Ausgabe

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) 

Ich verstehe die erste Ausgabe ist foo 's Destruktor und die dritte ist foo' s Konstruktor. Was sind die zweiten und vierten (die mit den Backticks)? Allgemeiner, was sind die anderen Orte, wo ich Backticks im Debugger des Benutzermodus sehen könnte?

Interessanterweise gehen die Graviszeichen Funktionen entfernt, wenn eine der folgenden

getan
  • entfernen std::cout Aussagen
  • entfernen std::string s
  • Fügen Sie den throw() Schlüsselwort vor dem Konstruktor und Destruktor

Dies scheint darauf hinzudeuten, dass die Backtick-Funktionen etwas mit der Ausnahmebehandlung zu tun haben

Antwort

2

Dies sind interne Namen, die vom Microsoft-Compiler für "Leim" -Funktionen generiert werden, die zwar dazu beitragen, dass die Dinge zusammenpassen, aber nicht direkt einer Zeile des Quellcodes entsprechen. Es ist normal.

Es gibt andere Situationen, in denen ähnliche interne Namen mit Backticks angezeigt werden, z. B. die Verwendung von Lambda-Funktionen oder das Aufrufen einer Funktion, die in einer Struktur innerhalb einer anderen Funktion deklariert ist.

Andere Compiler haben verschiedene Möglichkeiten, ähnliche namenlose Code-Blöcke darzustellen; Der Standard diktiert hier kein bestimmtes Verhalten, und er ist ohnehin nur über den Debugger beobachtbar.

+1

Vermutlich wurde der Backtick ausgewählt, weil er nicht in C++ verwendet wird, daher kann er nicht für irgendein Konstrukt aus C++ - Quellcode verwechselt werden. –

+0

Definitiv. Natürlich gibt es viele Symbole zur Auswahl, die zu diesem Profil passen. In der Tat verwendet "dtor $ 0" das '$', nur weil es außerhalb des Bereichs der zulässigen Zeichen liegt. – StilesCrisis

+0

Außer dass eine Reihe von C und C++ - Compiler '$' in Bezeichnern als Erweiterung zulassen. –

Verwandte Themen