sizeof offsetof verschachtelte structs

#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)
#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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren