Ich arbeite an einer Logging / Tracing-Einheit (und bitte nicht auf bestehende verweisen, dies ist für die Erfahrung genauso wichtig wie für das Ergebnis).
Um eine Laufzeitaufruf-Stack-Ablaufverfolgung zu erhalten, besteht die Idee darin, zuerst eine Instanz von TraceObject
zu erstellen, in die eine Funktion eingegeben wird, die die Informationen der aktuellen Klasse und Funktion enthält. Etwas ähnlich wie:
Der Konstruktor von TraceObject
schiebt this
auf einen Pro-Thread-Stack, der Destruktor öffnet ihn erneut. Der Stack kann somit für den Call-Stack abgefragt werden.
Ich habe das zur Zufriedenheit erledigt. Allerdings gibt es einen kleinen Schnatz: Das Objekt to
. Es wird per Entwurf nie mit diesem Namen bezeichnet werden. Daher muss es keinen Namen haben, am allerwenigsten einen, der mit irgendwelchen Bezeichnern kollidieren könnte, die vom Client verwendet werden (oder, im Falle von _
Präfix, die Implementierung).
tl; dr
Ist es möglich, ein anonymes , nicht-temporäres Objekt auf dem Stapel zu erstellen (dh eines, das solange leben wird, bis die Funktion zurückkehrt, aber keine Kennung hat), und wenn ja, wie wäre es getan?
Nein.
Es gibt anonyme Objekte in C ++, Provisorien, die das Ergebnis von Ausdrücken sind. Sie leben jedoch nur im Kontext der Anweisung, in der sie sich befinden.
Wenn Sie tatsächlich versuchen, ein anonymes Objekt zu deklarieren, verwirren Sie den Parser und er denkt, Sie deklarieren ... eine Funktion!
Aber dann, ist es notwendig?
Wenn Sie akzeptieren, Makros zu verwenden, um TraceObject
tatsächlich zu deklarieren, ist es so einfach, für jede Ablaufverfolgung ein Makro zu verwenden; und somit die Klasse und Funktion dort bereitstellen. Mit __func__
oder äquivalent können Sie den Klassennamen und den Funktionsnamen extrahieren (Bit des benötigten String-Parsers, abhängig vom Compiler) und von dort aus arbeiten.
Und natürlich würden Sie sowieso für jede Spur ein Makro verwenden, weil Sie wahrscheinlich den Dateinamen und die Zeilennummer möchten!
Wie ich in meinem Kommentar gesagt habe, können beschränkte anonyme Variablen nicht verwendet werden.
%Vor%Dies sollte es tun, vorausgesetzt, es gibt einen Compiler-Makro, um den Klassennamen zu erhalten.
Edit: Kein Glück mit einem einfachen Weg, Klassennamen zu bekommen, müssen Sie etwas tun, was in Klassennamen Makro . Oder machen Sie einfach mit __FILE__
.
Bearbeiten: Sie können __func__
und __FUNCTION__
ausprobieren, um zu sehen, ob eines oder beide so funktionieren, wie Sie es möchten. Weder ist C ++ - Standard angegeben.
Tags und Links c++