Ich arbeite an einer Protokollierung/Tracing-Einheit (und bitte nicht zeigen auf bestehende, dies ist für die Erfahrung so viel wie für das Ergebnis).Anonyme Objekte auf dem Stapel, in C++?
Um eine Laufzeitaufruf-Stack-Trace zu erhalten, ist die Idee, eine TraceObject
Instanz zu erstellen, zuerst eine Funktion eingegeben wird, die die Informationen der aktuellen Klasse und Funktion enthält. Etwas ähnlich:
TraceObject to("MyClass", "myClassFunction");
Konstruktor TraceObject
this
auf einer Pro-Thread-Stack drückt, springt der Destruktor ihn wieder. Der Stapel kann somit für den Aufrufstapel abgefragt werden.
Ich habe das funktioniert zur Zufriedenheit. Allerdings gibt es einen kleinen Schnatz: Das Objekt to
. Es wird, von Entwurf, nie mit diesem Namen bezeichnet werden. Daher muss keinen einen Namen haben, am allerwenigsten einer, der mit den vom Client verwendeten Bezeichnern kollidieren könnte (oder im Fall von _
Präfix die Implementierung).
tl; dr
Ist es möglich, ein anonymen, nicht-temporäres Objekt auf dem Stapel zu erstellen (dh eine, die bis der Funktion zurückkehrt leben, aber nicht über eine Kennung), und wenn ja, wie würde es gemacht werden?
Ich glaube nicht, dass es möglich ist, streng, aber mit einem Makro und einem obskuren Namen, können Sie das gleiche erreichen. Gibt es einen triftigen Grund, warum Sie es brauchen, um namenlos zu sein oder ist es eher ein "es ist nicht wirklich erforderlich". –
@KarthikT: Ja, ein Wrapper-Makro war die allgemeine Idee. Ich habe mich nur gefragt, ob ich "obskur" beseitigen und "unsichtbar" erreichen könnte. – DevSolar
@Karthik T genau, das ist auch, wie Boost-Protokoll macht es so meine Vermutung ist: es gibt keinen anderen Weg – stijn