Liste der C-Strukturelemente abrufen

8

Ist es möglich, die Liste der Mitglieder einer Struktur als char ** zu erhalten?

Zum Beispiel so etwas:

%Vor%

Ich interessiere mich auch für compilerabhängige Methoden. Gibt es so etwas?

Danke für Ihre Zeit.

    
nc3b 06.10.2011, 12:30
quelle

6 Antworten

2

Es gibt definitiv keinen Standardweg.

Wenn Sie bereit sind, den Code zweimal zu kompilieren, können Sie einen Präprozessor-define-Wrapped-Codepath nur für den zweiten Durchlauf aktivieren, der Debugging-Informationen von den Kompilierungseinheiten liest, die beim ersten Durchlauf erzeugt wurden, um die Elementnamen zu erhalten. Sie können auch den Quellcode analysieren, um die Liste zur Laufzeit zu erhalten.

Schließlich können Sie Präprozessormakros verwenden, um die Struktur zu definieren, und die Makros geben auch einen Eintrag in einer anderen Variablen für jedes Strukturelement aus, wodurch zwei nicht direkt verknüpfte Elemente effektiv synchronisiert werden.

    
Borealid 06.10.2011, 12:35
quelle
10

Hier ist ein Proof of Concept:

%Vor%

Dies ist die Ausgabe:

%Vor%

Sie können es verbessern, um komplexere Elementtypen besser zu unterstützen und eine Liste mit Namen der Mitglieder zu erstellen.

    
Alexey Frunze 06.10.2011 14:20
quelle
2

Dafür gibt es keinen portablen Standard. Letztes Mal, als ich ein ähnliches Problem lösen wollte, habe ich SWIG verwendet, um etwas XML zu erzeugen, das ich dann verarbeitet habe, um die gewünschten Meta-Informationen zu generieren. gcc-xml könnte das Gleiche tun.

    
Flexo 06.10.2011 12:34
quelle
1

Nein, das ist nicht möglich.

C ist eine statisch typisierte Sprache ohne Reflektion. Typnamen haben nach der Kompilierungsphase keine Bedeutung und es ist nicht einmal der Fall, dass eine bestimmte Variable im Binärcode überhaupt sichtbar ist. Der Compiler hat eine Menge Freiheit, um zu optimieren und neu zu ordnen, solange sich das Programm verhält, wie vom Sprachstandard beschrieben.

Sie können eine Präprozessor-Magie ausprobieren, um ein begrenztes Handle für Typnamen zu erhalten, aber das ist alles andere als eine allgemeine Reflexion (und streng genommen außerhalb der C-Sprache).

Das Prinzip, das Sie in nicht tun können, ist dies:

%Vor%

Typnamen sind nicht Laufzeitkonzepte; und darüber hinaus macht die statische Typisierung eine solche Konstruktion unmöglich.

Hier ist einer der wenigen Präprozessor-Gimmicks, die ich mir vorstellen kann:

%Vor%     
Kerrek SB 06.10.2011 12:35
quelle
1

Sehen Sie sich die Metaresc-Bibliothek Ссылка

an

Es bietet eine Schnittstelle für die Typdeklaration, die auch Metadaten für den Typ generiert. Basierend auf Metadaten können Objekte beliebiger Komplexität einfach serialisiert / deserialisiert werden. Out-of-the-Box können Sie XML, JSON, XDR, Lisp-ähnliche Notation, C-Init-Notation serialisieren / deserialisieren.

Hier ist ein einfaches Beispiel:

%Vor%

Dieses Programm gibt

aus %Vor%

Bibliothek funktioniert gut für die neuesten gcc und kling.

    
Herman Narkaytis 11.08.2015 18:14
quelle
0

Qt scannt die .h-Dateien und generiert .cpp mit der Funktion, die diesen Code zurückgibt.

Sie können dies auch mit einer Reihe von Makros erreichen, aber Sie müssen sie für jede Art von Hand schreiben

    
crazyjul 06.10.2011 12:34
quelle

Tags und Links