generische Möglichkeit zum drucken von Variablen-Namen in c++
gegeben eine Klasse
struct {
int a1;
bool a2;
...
char* a500;
...
char a10000;
}
Will ich drucken oder stream
"a1 value is SOME_VALUE"
"a2 value is SOME_VALUE"
"a500 value is SOME_VALUE"
...
"a10000 value is SOME_VALUE"
den Typ der member-Variablen sind nicht das gleiche (vor allem, int, bool, char*, etc, also, keine Notwendigkeit, um eine überlastung << operator), und die member-variable name könnte genannt werden, mit nichts, also, keine Regel zu Folgen. Anstatt explizit einen von einer (sehr großen mühsame und fehleranfällige Arbeit), gibt es eine Allgemeine Möglichkeit?
Vielen Dank für alle Kommentare!
- Einige frameworks spiegelung hinzuzufügen, aber dies ist nicht eine native Sprache-Funktion
- Es gibt keine Allgemeine Möglichkeit, das zu tun, was Sie wollen in C++. Sie sollten sich Fragen, ob Sie das richtige Werkzeug für den job. Betrachten Sie entweder eine andere Sprache oder eine andere Datenstruktur in C++, vielleicht auch ein Vektor oder eine Liste.
- Außerdem, kann man wirklich nicht tun es richtig. Nehmen
struct { std::string a; }
- willst du das wirklich ausdruckena._BUF[0] = 'H' a._BUF[1] = 'e' a._BUF[2] = 'l' , a._BUF[0] = 'l'
etcetera? Oder möchten Sie lieber wollena = "Hello, world\n"
? C++ hat eine klare Vorstellung, wie Sie druckenstruct Foo
, und das ist mitoperator<<(std::ostream&, Foo);
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Funktion, die Sie suchen, sind in der Regel sogenannte Reflexion. Es ist nicht Teil von C++, da in Programmiersprachen, die kompiliert die Informationen, die Sie nach den (von Menschen lesbaren Namen von Variablen), ist grundsätzlich nicht gehalten, die vom compiler. Es ist nicht erforderlich, um den code auszuführen, so hat es keinen Sinn, wie it.
Debugger können oft überprüfen entweder out-of-band-symbol Informationen oder das symbol Daten in Binärdateien für diesen Zweck, zu zeigen, wie Namen, sondern re-doing, dass für diesen Zweck ist wahrscheinlich mehr Arbeit, als es Wert ist.
Ich würde vorschlagen, auf der Suche nach einigen von den vielen "tricks" (=Lösungen) zu implementieren, die diese selbst.
pstruct
Befehl parst die Ausgabe vongcc -g -s
zu Holen Sie sich die Informationen in verwertbarer form. Es wurde für die Verwendung mit perl, aber man könnte es für diese Art von AnsatzKönnen Sie beschäftigen eine böse makro:
Anwendungsbeispiel (Bearbeiten jetzt aktualisiert mit Beispiel für einen struct-Mitglieder):
Live sehen demo auf CodePad
Warum das lustig makro?
Beantworten Sie die unausgesprochene Frage. Überlegen Sie, was passiert, wenn Sie das nest der makro-Aufruf in eine bedingte, oder eine for-Schleife. Marshall Cline, erklärt den rest
Es ist nicht möglich, (siehe die anderen Antworten).
Einer Abhilfe für diese ist die Verwendung der automatischen code-Generierung. Schreiben Sie die Feld-Definitionen in eine Datei und erstellen Sie dann die .h und .cpp-Dateien aus. Ich habe diese für einen code, der bereits rund 100 Klassen mit vielen Feldern. Es war in der Lage, um den code zu generieren für Sie schicken, um streams (meist debugging) und für die socket-Kommunikation. Es ist sehr zuverlässig (hatte nie testen alle diese Funktionen), aber da es kein reines C++ ist es vielleicht nicht die Lösung für Sie.
Den
watch
makro ist eines der nützlichsten tricks, die jemals.Wenn Sie Ihren code Debuggen,
watch(variable);
wird, drucken Sie den Namen der variable und Ihren Wert. (Es ist möglich, weil es gebaut wird während der Vorverarbeitung der Zeit.)Gibt es keine Möglichkeit zum auflisten von Mitgliedern der Klasse in C++, da es keine Reflexion in C++. Sie können also den Zugriff auf die variable name.
Könnte man Zeiger verwenden, um Mitglieder obwohl...
GDB kann print-Strukturen. Dieses Skript generiert, gdb-Skript zum setzen von breakpoints und die print-Werte im angegeben gdb_print Standorte:
Vom https://gitlab.com/makelinux/lib/blob/master/snippets/gdb-print-prepare.md