GCC - Struct definiert Elemente in bestimmten Offsets

8

Gibt es einen Weg in gcc, wo ich eine Struktur mit einem bestimmten Member in einem bestimmten Offset definieren könnte?

Ich möchte eine Struktur folgendermaßen definieren:

%Vor%

und dann die folgende Aussage:

%Vor%

ist identisch mit der Aussage:

%Vor%

* AKTUALISIEREN *

Etwas Hintergrund: Ich möchte auf Mitglieder in einer exportierten Struktur zugreifen, die ich nicht richtig definiere, sie hat viele Mitglieder - die mir nur eine Handvoll von ihnen interessieren, und ihr Offset (die Struktur - Originaldefinition) ist auf jeder Zielplattform etwas anders (I müssen meinen Code für ein paar verschiedene Plattformen kompilieren)

Ich habe die Padding-Option erwogen, die in den Kommentaren hier erwähnt wird, aber es erfordert, dass ich jedes Mal, wenn ich ein Mitglied hinzufügen möchte, einige lästige Berechnungen mache. zum Beispiel:

%Vor%

ist dann einfacher:

%Vor%

und das ohne Berücksichtigung der Tatsache, dass sich die Größe von (int) von Plattform zu Plattform ändern kann

    
t_z 23.11.2011, 08:05
quelle

6 Antworten

9

Sie sollten sich __attribute__ ((__packed__)) ansehen.

In Ihrem Fall würden Sie schreiben:

%Vor%

Wenn Sie erklären könnten, was Sie zu tun versuchen, könnte es andere, möglicherweise elegantere Lösungen geben.

    
INS 23.11.2011 08:13
quelle
2

Sie können es immer mit Bytes auffüllen und sicherstellen, dass Sie gcc anweisen, Ihre Strukturen nicht auszurichten (da dies die Offsets auslöschen könnte). In diesem Fall benötigen Sie ein Mitglied wie char pad_bytes[num_pad_bytes]; . Aber gibt es einen Grund, das wirklich zu tun? Sie können den Offset eines Elements einer Struktur immer berechnen, indem Sie eine Zeigerarithmetik ausführen. Hinweis: Möglicherweise möchten Sie den uint8_t -Typ zum Auffüllen anstelle von char verwenden, da manche Compiler tatsächlich char (normalerweise ein Byte) auf die Größe eines Wortes auffüllen können.

Das Berechnen von Offset ist so einfach wie

%Vor%

All dies bewirkt einfach, dass ein Zeiger auf struct_type zurückgegeben wird, wenn die Struktur bei 0x00 im Speicher ist (was es nie sein kann), aber da wir 0 als Basis verwenden, ist der Offset einfach die Referenz, die von zurückgegeben wird die & amp; Betreiber.

    
Jesus Ramos 23.11.2011 08:08
quelle
2
  

Ich habe die Padding-Option, die hier in den Kommentaren erwähnt wird, in Betracht gezogen, aber es erfordert, dass ich jedes Mal, wenn ich ein Mitglied hinzufügen möchte, ein paar nervige Berechnungen mache.

Bei ärgerlichen Berechnungen können Sie die Deklaration Ihrer Struktur mit Ihrer bevorzugten Skriptsprache einfach generieren :

%Vor%

Ausgaben:

%Vor%     
chill 23.11.2011 10:11
quelle
2

Eine Lösung, die Padding und Union verwendet, wie in anderen Antworten vorgeschlagen:

%Vor%

Ausgabe:

%Vor%     
calandoa 23.11.2011 16:53
quelle
1

Ich würde eine Klasse schreiben, die einen Zeiger umschließt:

%Vor%

Dies ist vollständig portabel und funktioniert wie erwartet auf Big-End-Architekturen. Signierte Ganzzahlen sind ein bisschen komplizierter, da Sie die Kodierung richtig machen müssen.

    
Simon Richter 23.11.2011 18:03
quelle
0

Ich schlage nicht vor, dies zu tun; Strukturen sind nicht für diese Art von Datenmanipulation gedacht. Wenn Sie Daten an einer bestimmten Position ändern müssen, verwenden Sie einen korrekt typisierten Zeiger, um die Änderungen auf diese Weise vorzunehmen. Das Hinzufügen von Strukturen in den Mix erhöht die Komplexität ohne Nutzen.

    
jmkeyes 23.11.2011 08:19
quelle

Tags und Links