Forum: Compiler & IDEs sizeof offsetof verschachtelte structs


von Michael R. (michi42)


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

von Dr. Sommer (Gast)


Lesenswert?

Das offsetof Zeug klappt auch in C. Und warum nicht einfach C++ nehmen, 
ist deine Zielplattform so obskur dass es keinen C++ Compiler gibt?

von Karl H. (kbuchegg)


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)

von chris (Gast)


Lesenswert?

int o1= offsetof(bar,j ); // ok in c++ und c

Bei C muss man <stddef.h> einbinden.

von Michael R. (michi42)


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

von Rolf Magnus (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.