sizeof offsetof verschachtelte structs

OP #3414452
Lesenswert?
• ▲
▼
Hi,

ich brauche mal eine Idee, wie ich eine Größenberechnung in C anstelle.
Ich möchte soetwas wie eine Datensatzbeschreibung aus einer 
verschachtelten c-Struktur ableiten.
Die C-Struktur ist generierter Code.

Nur mal so zur Veranschaulichung:
1
typedef struct _foo
2
{
3
  int i;
4
  int k;
5
} foo;
6

7
typedef struct _bar
8
{
9
  int j;
10
  foo f;
11
} bar;
12

13

14
int main()
15
{
16
  int g1=sizeof(bar::j); // ok in c++
17
  int g2=sizeof(bar::f.i); // ok in c++
18
  int o1= offsetof(bar,j ); // ok in c++
19
  int o2= offsetof(bar,f.i ); // ok in c++
20
...

Mir fehlt leider gerade die Idee wie man es in c machen könnte- Der :: 
Operator fällt ja flach.
Wenn es geht, möchte ich auch keine Instanz der Struktur erzeugen und 
mit char* cast Adressen bestimmen und damit rumrechnen.

Ach ja, Strukturdefinition komplett auf Metatypen ändern scheidet aus 
und den Trick über den Null-Pointer kenne ich auch schon.

Ok, int's sind nun etwas langweilig, aber schon bei char wird's wegen 
des Alignments spannend.
Gruß,
  Michi
#3414477
Lesenswert?
• ▲
▼
Michael R. schrieb:

> Wenn es geht, möchte ich auch keine Instanz der Struktur erzeugen

Das könnte knifflig werden.
Die einzige Variante die mir dazu einfällt sieht syntaktisch so 
grauslich aus, dass ich das erst gar nicht ausprobiere. Das wäre sicher 
nicht legitim

Was stört dich denn an einer Instanz?

  bar tmp;

    ... sizeof( tmp.j );

müsste eigentlich funktionieren. (denke ich mal)
OP #3414592
Lesenswert?
• ▲
▼
Ok,
stddef.h war klar.
int o1= offsetof(bar,j ) geht immer
Es geht aber um die Member der eingebetteten Struktur.

Mit Instanz
1
  bar b;
2
  int g2=sizeof(b.f.i);
gehts. (was vermutlich das geringste Übel ist)
Ich bin aber von Natur aus stur. Die Info ist zur Compiletime bekannt - 
dann hat das auch ohne Instanz zu funktionieren.

Warum nicht c++
Die Platform war "früher" eine andere und es gab nur c. Das ganze Gerüst 
ist "gewachsen" und enthält etliche Lines of Code. Darauf aufgesetzt 
sind später generierte c++ Wrapperklassen usw. Und Name-Mangling unter 
c++ nicht zu vergessen.
Bevor ich da was strukturell verbessern kann hackt mir die wilde Horde 
die Hände ab. -> Also Knopflochchirurgie.


btw:
<rant>
Hatte ich eigentlich schon mal erwähnt das c und c++ totaler Murks ist?
Und Java ist keinen Deut besser.
Metaprogrammierung war schon 1958 erfunden. c 20 Jahre später. Alle drei 
können es heute noch nicht. c++ und Java brauchen für Templatetypen eine 
Syntax zum davonlaufen.
</rant>
Gruß,

  Michi
Gast #3414989
Lesenswert?
• ▲
▼
Karl Heinz schrieb:
> Michael R. schrieb:
>
>> Wenn es geht, möchte ich auch keine Instanz der Struktur erzeugen
>
> Das könnte knifflig werden.

Man kann sich zunutze machen, daß das Dereferenzieren von ungültigen 
Zeigern in sizeof erlaubt ist:
1
sizeof ((foo*)NULL)->i;

Karl Heinz schrieb:
> Was stört dich denn an einer Instanz?

Gute Frage. Ich würde erwarten, daß der Compiler die komplett 
wegoptimiert, wenn sie eh nur für's sizeof verwendet wird.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.