Warum wird der Visual Studio 2010-Debugger nicht angezeigt?

8

Diese Frage steht in engem Zusammenhang mit einer anschließend gestellten Frage hier.

Die Methode zur Definition von Klassenkonstanten wird hier von Stroustrup beschrieben.

Wenn ich Stroustrups Methode befolge, sehe ich die erwarteten Ergebnisse. In Visual Studio 2010 kann der Debugger jedoch ein static const -Klassenmitglied innerhalb des Bereichs dieser Klasse nicht auflösen. Hier ist was ich meine:

%Vor%

Wenn der Debugger in showA () ist, meldet das Fenster "watch":

%Vor%

Ich möchte betonen, dass sich das Programm wie erwartet verhält, d. h. die Ausgabe ist:

%Vor%

und das Programm gibt 0 zurück.

Kann jemand anderes dies mit Visual Studio 2010 reproduzieren? Ist das ein Fehler im Debugger?

    
user2141130 03.05.2013, 18:59
quelle

3 Antworten

2

Visual C ++ bietet fälschlicherweise eine schwache Definition (in dieser Antwort enthaltene Beweise) , die auf der Deklaration innerhalb der Klasse basiert, obwohl klare Sprache im Standard:

  

Die Deklaration eines statischen Datenmembers in seiner Klassendefinition ist keine Definition und kann einen anderen unvollständigen Typ als cv-qualified void haben. Die Definition für ein statisches Datenelement muss in einem Namensbereichsbereich mit der Klassendefinition des Elements angezeigt werden. In der Definition im Namespacebereich muss der Name des statischen Datenmembers anhand seines Klassennamens mit dem Operator :: qualifiziert werden.

Gemäß der anderen Regel im Standard ist keine Definition erforderlich, wenn das Element nicht odr-used ist.

Ob es eine explizite Definition oder eine schwache Definition gibt, die fälschlicherweise von Visual C ++ bereitgestellt wird, spielt jedoch keine Rolle. Wenn der Member nicht odr-used ist, wird der Linker keine Verweise darauf sehen und wird ihn entfernen, so dass der Debugger verwirrt darüber ist, ob er jemals existiert hat. Mit dem Microsoft Linker können Sie diese Optimierung mit /OPT:NOREF verhindern.

Das ist aber letztendlich nicht das, was Sie im Produktionscode machen wollen, da Sie in Ihrer Anwendung alle Arten von Restmaterial aus der Standardbibliothek übrig haben. Aber für die temporäre Verwendung während des Debuggens ist das eine vernünftige Einstellung.

    
Ben Voigt 06.05.2013, 19:49
quelle
7

Sie können eine Definition für Ihr statisches Datenelement im globalen Namespace-Bereich hinzufügen:

%Vor%

Das Hinzufügen der statischen Datenelementdefinition, die nicht notwendig, aber erlaubt ist, scheint Ihr Problem zu lösen.

Ich habe dies in einem Debug-Build mit VS2010 getestet, und der Wert von A wird im Debug-Fenster korrekt angezeigt, wenn die Definition vorhanden ist (während eine Fehlermeldung angezeigt wird, wenn die Definition fehlt, konsistent mit dem, was Sie erwähnen ).

    
Andy Prowl 03.05.2013 19:06
quelle
3

Dies ist kein Fehler. Der Compiler kann (und wird fast immer) statische Grundtypen optimieren. Anstatt den Speicher für A zuzuweisen, wird der Wert von A in die kompilierten Anweisungen eingefügt.

Weil A nicht irgendwo gespeichert ist, hat es keine Adresse, daher kann der Debugger sie nicht sehen.

    
Collin Dauphinee 03.05.2013 19:04
quelle