2011-01-14 7 views
0

Ist es möglich, die Elemente (Name & Datentyp) in einer Struktur (C-Sprache) in einer Bibliothek zu bestimmen? Wenn ja, wie geht das in C? Wenn die C-Sprache dies nicht unterstützt, ist es möglich, die Strukturelemente durch andere Tricks zu erhalten oder gibt es dafür ein Werkzeug?Suchen der Elemente in einer Struktur in C-Sprache

Antwort

3

Nein, das ist nicht möglich. C hat keine eingebaute Reflection-Style-Unterstützung.

5

Meinen Sie herausfinden, wenn Sie programmieren, oder dynamisch zur Laufzeit?

Für die ehemalige, sicher. Suchen Sie einfach die .h-Datei, die Sie einbeziehen, und Sie finden dort die Strukturdefinition einschließlich aller Felder.

Für letztere, nein, ist es nicht möglich. C kompiliert Strukturen, um Code so zu bearbeiten, dass all diese Informationen verloren gehen. Zum Beispiel, wenn Sie eine Struktur {int x, float y, int z} haben, und Sie haben einen Code, der

a = mystruct.y 

im Maschinencode sagt, alles, was ist so etwas wie das Finden der Zeiger auf mystruct bleiben wird, Zugabe von 4 bis sie (die Größe die int), und Lesen von 4 Bytes von dort, dann einige Fließkommaoperationen zu tun. Weder die Namen noch die Typen dieser Strukturfelder werden überhaupt zugänglich sein, und daher gibt es keine Möglichkeit, sie zur Laufzeit herauszufinden.

+0

Vielen Dank für die Antwort, aber wie finde ich den Zeiger auf mystruct im Maschinencode? –

+0

Sie müssten die Assembly lesen und verstehen (eine ganz andere Sprache). Aber ich glaube nicht, dass du das meinst. Vielleicht hast du missverstanden, als ich sagte "so etwas wie den Zeiger zu finden". Ich meinte, dass der generierte Code wissen wird, wo "mystruct" ist (vielleicht nimmt er die Adresse vom Stapel) und dann führt er die notwendige Arithmetik durch. Aber es gibt nicht genügend Informationen, um die Namen und Typen der Felder zur Laufzeit zu kennen. – mgiuca

0

Wenn Sie "die Elemente einer Struktur bestimmen" meinen, "die Deklaration dieses Strukturtyps programmgesteuert erhalten", dann glaube ich nicht, dass es möglich ist - zumindest nicht portabel. Im Gegensatz zu moderneren Sprachen wie C++ oder Java behält C die Typinformation nicht in einer Form, die dem tatsächlichen Programm zur Verfügung steht.

EDIT:

Um meinen Kommentar dazu ist unmöglich „portabel“ zu klären:

sehr gut könnte es einige Compiler + Debug-Format-Kombination sein, die die notwendigen Informationen in den Objektdateien einbetten würden, die es produziert , obwohl ich nicht sagen kann, ich kenne von einem. Sie könnten dann hypothetisch das Programm eine eigene ausführbare Datei öffnen lassen und die Debugging-Informationen parsen. Aber das ist ein umständlicher und zerbrechlicher Ansatz, bestenfalls ...

Warum müssen Sie so etwas tun?

+0

Ich habe eine Struktur, in die ich die Daten durch eine API gepackt habe, aber wenn ich versuche, den Wert auf der Konsole zu drucken, druckt es nicht den richtigen Wert. Also, wenn ich weiß, wo genau innerhalb der Struktur die Daten gespeichert werden, könnte ich es ausdrucken und damit versuchen, das bestimmte Element der Struktur zu finden. –

+0

@ S.Man: Können Sie Ihre Frage mit einem Beispielcode aktualisieren? Die meisten C-APIs, die Strukturen mit variablen Formaten erzeugen (normalerweise mithilfe von Unionen), haben auch ein oder mehrere Felder, so dass Sie erkennen können, welchem ​​Format jede Instanz entspricht. Wenn das Format nicht variabel ist, sollten Sie direkt auf die Elemente verweisen, – thkala

+0

@ S.Man könnte auch ein Alignment- (Pack-) Problem auftreten .... – T33C

Verwandte Themen