2017-11-28 2 views
1

Ich versuche, die Variablennamen einer Struktur innerhalb C. Beispiel zu finden:Erstellen Compile-Zeit Variable Offset Map

def.h

typedef struct 
{ 
    int fov_one; 
    int fov_two; 
    int timing_chain; 
    ... 
    ... 
    float ratio; 
    float spare_floats[15]; 
}PARAMETERS; 

Die Struktur Plätze für bis zu 200 Parameter hält, aber nur einige von ihnen sind zu dieser Zeit in Verwendung. Derzeit werden die Werte innerhalb der Struktur PARAMETERS mit einer Binärdatei gefüllt. Einige Benutzer möchten jedoch einen oder zwei der Werte zur Laufzeit ändern, nachdem sie ausgefüllt wurden. Ich möchte die Möglichkeit schaffen, einen Wert basierend auf einer String-Version des Variablennamens zu ändern. Wenn ich zum Beispiel das variable Verhältnis ändern möchte, möchte ich, dass der Benutzer in der Lage ist, eine Zeichenfolge "Ratio .25" einzugeben und den aktuellen Wert von "Ratio" durch ".25" zu ersetzen.

Von dem, was ich gelesen habe, ist es nicht möglich, eine Variable basierend auf einer String-Version des Variablennamens in C zu finden, da Reflection nicht vorhanden ist. Momentan denke ich daran, den Header zu analysieren, um den Variablennamen zu erhalten, aber jemand erwähnte, dass es möglich sein könnte, die Namen vom Linker zu bekommen, bevor sie weggestreift werden. Soweit ich weiß, entfernt der Compiler/Linker die Variablennamen während der Kompilierung und verwendet Adressen, um auf Variablen zuzugreifen, nicht auf Symbole.

Ich möchte wissen, ob es möglich ist, die Symbolzuordnung auszudrucken, die den Variablennamen und den Offset enthält, den der Compiler/Linker erstellt.

Mit den gcc Optionen

gcc -o foo foo.c -Wl,Map,foo.map 

erstellt eine Karte, aber enthält nicht die Variablennamen der Struktur.

Ist es möglich, die vom Compiler/Linker zur Compilierzeit erstellte Variable-Offset-Map zu extrahieren?

+0

Die Namen der Felder sind zur Kompilierungszeit bekannt, daher müssen Sie eine Funktion erstellen, die über jedes dieser 200 Felder und die Schlüsselwörter informiert ist, die für die Aktualisierung und Zuordnung der Felder verwendet werden. – dbush

Antwort

1

Struktur-Offsets sind als Teil der DWARF-Ausgabe (oder des Debugging-Formats Ihrer Zielbenutzer) verfügbar. Sie sind auch für Compiler-Plugins verfügbar.

Es könnte jedoch einfacher sein, direkten Code zu schreiben oder zu generieren, der PARAMETERS Objekte basierend auf einer Zeichenfolge aktualisiert. Sie können möglicherweise eine kompaktere Darstellung erstellen, indem Sie Strings der Feldnamen mit ihren Werten offsetof auflisten.

+1

Außerdem scheint es auf Benutzerebene wahrscheinlich, dass zumindest einige der Mitglieder bessere Namen haben als die, die im Code verwendet werden. Ich würde es hassen, sich daran erinnern zu müssen " – SoronelHaetir

0

Da Sie den Quellcode steuern, besteht die übliche Technik darin, zur Kompilierungszeit eine "Name zu Offset" -Karte zu erzeugen.

Zum Beispiel:

// parameter_fields.inc -- describes fields in struct PARAMETERS 
xxx(int, fov_one) 
xxx(int, fov_two) 
... 
xxx(float, ratio) 

// def.h 
struct _PARAMETERS { 
#define xxx(a, b) a b; 
    #include "parameter_fields.inc" 
#undef xxx 
} PARAMETERS; 

// in somefile.c 
#include <stddef.h> 
#include "def.h" 

struct { 
    const char *name; 
    int offset; 
} PARAMETER_OFFSETS[] = { 
#define xxx(a, b) #b, __offsetof__(struct _PARAMETERS, b), 
    #include "parameter_fields.inc" 
#undef xxx 
}; 

Jetzt haben Sie Offsets, um Ihren Code als Teil PARAMETER_OFFSETS Array zur Verfügung.